Fra din forespørgsel (læsbarhedsformateret)
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)
Bortset fra dit begrænsede indhold, lad os se på dig, der prøver at sammenligne data fra samme dag til dag + 1, +2 og +3. Lad os også antage, at du kun for dette eksempel kun har 10 dage i tabellen repræsenteret som alle 1. juni - 10. juni 2016 i både dine Tabel1- OG Tabel2-tabeller.
Igen er dette en antagelse om, at hver tabel har alle 10 pågældende datoer, bare for forenklede formål med, hvorfor så mange poster. Så for Tabel 1-datoen 1. juni 2016 vil den kvalificere sig med tabel 2 (tb21-version) og returnere TO poster. En for 1. juni og en anden for 2. juni. Så nu har du TO rekorder i dit resultat. Nu gør du det igen, venstre-join til tabel 2 (tb22 version). Denne gang leder du efter 2 og 3 dage ude, hvoraf du har 3. og 4. juni i tabellen. Så du får et kartesisk resultat. Så for 1. juni-posten i tabel 1 har du nu 4 poster som følger.
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
Lad os nu sige, at din tabel 2 har 3 poster den 2. juni og 3 poster den 3. juni, og dine data kommer til at svulme op. Dette er grunden til, at du er nødt til at give mere afklaring på, hvad du forsøger at gøre.
Så, uden at have en sand kontekst på det, du leder efter, ignorer det faktum, at det ikke perfekt udnytter dit indeks. Du har en OR baseret på datoen via dag-sammenligningerne. Det skal alligevel stadig bruges til forespørgslen.