Från din fråga (läsbarhetsformaterad)
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)
Bortsett från ditt restriktiva innehåll som tillhandahålls, låt oss titta på dig som försöker jämföra data från samma dag till dag + 1, +2 och +3. Låt oss också anta att du bara för det här exemplet bara har 10 dagar i tabellen representerade som alla 1 juni - 10 juni 2016 i både tabellerna Tabell1 OCH Tabell2.
Återigen, detta är ett antagande att varje tabell har alla 10 datum i fråga bara för förenklade syften om varför så många poster. Så för tabell 1-datumet den 1 juni 2016 kommer den att kvalificera sig med tabell 2 (tb21-version) och returnera TVÅ poster. En för 1 juni och en annan för 2 juni. Så nu har du TVÅ rekord i ditt resultat. Nu gör du det igen och vänster-anslut till tabell 2 (tb22 version). Den här gången letar du efter 2 och 3 dagar ut, varav du har 3 och 4 juni i tabellen. Så du får ett kartesiskt resultat. Så för 1 juni-posten i tabell 1 har du nu 4 poster enligt följande.
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
Låt oss nu säga att din tabell 2 har 3 poster den 2 juni och 3 poster den 3 juni och din data kommer att bli supersvälld. Det är därför du behöver ge mer förtydligande om vad du försöker göra.
Så, utan att ha ett riktigt sammanhang på vad du letar efter, ignorera det faktum att det inte använder ditt index perfekt. Du har ett ELLER baserat på datumet via dagsjämförelserna. Det bör fortfarande användas för frågan i alla fall.