Z zapytania (format czytelności)
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)
Oprócz Twoich restrykcyjnych treści, przyjrzyjmy się, jak próbujesz porównać dane z tego samego dnia na dzień + 1, +2 i +3. Załóżmy również, że tylko dla tego przykładu masz tylko 10 dni w tabeli reprezentowanej jako wszystkie od 1 czerwca do 10 czerwca 2016 r. zarówno w tabelach Tabela 1, jak i Tabela 2.
Ponownie, jest to założenie, że każda tabela zawiera wszystkie 10 dat, o których mowa, tylko w celu uproszczenia, dlaczego tak wiele rekordów. Tak więc dla tabeli 1 z dnia 1 czerwca 2016 r. zakwalifikuje się ona z tabelą 2 (wersja tb21) i zwróci DWA rekordy. Jeden na 1 czerwca, a drugi na 2 czerwca. Więc teraz masz w swoim wyniku DWA rekordy. Teraz robisz to ponownie, dołączając do tabeli 2 (wersja tb22). Tym razem szukasz 2 i 3 dni wolnego, z czego w tabeli masz 3 i 4 czerwca. Więc otrzymujesz wynik kartezjański. Tak więc dla rekordu 1 czerwca w tabeli 1 masz teraz 4 rekordy w następujący sposób.
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
Teraz powiedzmy, że Twój stół 2 ma 3 wpisy 2 czerwca i 3 wpisy 3 czerwca, a Twoje dane będą się bardzo powiększać. Dlatego musisz podać więcej wyjaśnień na temat tego, co próbujesz zrobić.
Tak więc, nie mając prawdziwego kontekstu tego, czego szukasz, zignoruj fakt, że nie wykorzystuje on idealnie Twojego indeksu. Masz OR na podstawie daty za pomocą porównań dziennych. W każdym razie powinien być wykorzystany w zapytaniu.