Van uw zoekopdracht (leesbaarheid geformatteerd)
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)
Laten we, afgezien van uw beperkende inhoud, eens kijken hoe u de gegevens van dezelfde dag probeert te vergelijken met + 1, +2 en +3. Laten we er voor dit voorbeeld ook van uitgaan dat u slechts 10 dagen in de tabel heeft, weergegeven als alle 1 juni - 10 juni 2016 in zowel uw Tabel1 EN Tabel2 tabellen.
Nogmaals, dit is een aanname dat elke tabel alle 10 datums in kwestie heeft, alleen voor simplistische doeleinden van waarom zoveel records. Dus voor tabel 1 datum van 1 juni 2016, zal het kwalificeren met tabel 2 (tb21 versie) en TWEE records retourneren. Een voor 1 juni en een andere voor 2 juni. Dus nu heb je TWEE records in je resultaat. Nu doe je dat weer left-join naar tabel 2 (tb22 versie). Dit keer zoek je 2 en 3 dagen uit, waarvan je 3 en 4 juni in de tabel hebt staan. Je krijgt dus een cartesiaans resultaat. Dus voor het record van 1 juni in tabel 1 heb je nu als volgt 4 records.
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
Laten we nu zeggen dat uw tafel 2 3 vermeldingen heeft op 2 juni en 3 vermeldingen op 3 juni en dat uw gegevens enorm zullen opzwellen. Daarom moet je meer uitleg geven over wat je probeert te doen.
Dus, als je geen echte context hebt over wat je zoekt, negeer het feit dat het je index niet perfect gebruikt. U heeft een OK op basis van de datum via de dagvergelijkingen. Het zou hoe dan ook nog steeds moeten worden gebruikt voor de query.