Z vašeho dotazu (ve formátu čitelnosti)
SELECT
table1.*,
tb21.year,
tb21.month,
tb21.day,
tb22.year,
tb22.month,
tb22.day
FROM
table1
LEFT JOIN table2 tb21
ON table1.year = tb21.year
AND table1.month = tb21.month
AND (tb21.day = table1.day
OR tb21.day = table1.day+1)
LEFT JOIN table2 tb22
ON table1.year = tb22.year
AND table1.month = tb22.month
AND (tb22.day = table1.day+2
OR tb22.day = table1.day+3)
Kromě vašeho omezujícího obsahu, který jste poskytli, se podívejme na vás, když se pokoušíte porovnat data ze stejného dne na den + 1, +2 a +3. Předpokládejme také, že pouze pro tento příklad máte v tabulce pouze 10 dní reprezentovaných jako celý 1. červen až 10. červen 2016 v obou tabulkách Table1 A Table2.
Opět se jedná o předpoklad, že každá tabulka má všech 10 příslušných dat, jen pro zjednodušení, proč tolik záznamů. Takže pro tabulku 1 datum 1. června 2016 se bude kvalifikovat s tabulkou 2 (verze tb21) a vrátí DVA záznamy. Jeden na 1. června a druhý na 2. června. Takže teď máte ve svém výsledku DVA záznamy. Nyní to udělejte znovu levým připojením k tabulce 2 (verze tb22). Tentokrát hledáte 2 a 3 dny venku, z toho máte v tabulce 3. a 4. června. Získáváte tedy kartézský výsledek. Takže pro záznam 1. června v tabulce 1 máte nyní 4 následující záznamy.
T1Year T1Month T1Day T21Day T22Day
2016 6 1 1 3
2016 6 1 1 4
2016 6 1 2 3
2016 6 1 2 4
Nyní řekněme, že váš stůl 2 má 3 položky 2. června a 3 položky 3. června a vaše data budou super nafouknutá. To je důvod, proč potřebujete více objasnit, co se snažíte udělat.
Pokud tedy nemáte skutečný kontext toho, co hledáte, ignorujte skutečnost, že váš index dokonale nevyužívá. Máte OR založený na datu prostřednictvím porovnání dnů. I tak by se měl pro dotaz používat.