От вашата заявка (форматирана за четливост)
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)
Освен предоставеното от вас ограничаващо съдържание, нека ви разгледаме как се опитвате да сравните данните от един и същи ден на ден + 1, +2 и +3. Нека също така приемем само за този пример, че имате само 10 дни в таблицата, представени като всички 1 юни – 10 юни 2016 г. и в двете таблици Table1 И Table2.
Отново, това е предположение, че всяка таблица има всичките 10 въпросни дати само за опростени цели защо толкова много записи. И така, за дата на таблица 1 от 1 юни 2016 г., тя ще отговаря на изискванията на таблица 2 (версия tb21) и ще върне ДВА записа. Един за 1 юни и друг за 2 юни. Така че сега имате ДВА записа в резултата си. Сега правите това отново - присъединете се отляво към таблица 2 (версия tb22). Този път търсите 2 и 3 дни навън, от които имате 3 и 4 юни в таблицата. Така че получавате декартов резултат. И така, за записа от 1 юни в таблица 1 вече имате 4 записа, както следва.
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
Сега, да кажем, че вашата таблица 2 има 3 записа на 2 юни и 3 записа на 3 юни и вашите данни ще се раздуят супер. Ето защо трябва да предоставите повече разяснения за това, което се опитвате да направите.
Така че, ако нямате истински контекст за това, което търсите, игнорирайте факта, че не използва идеално вашия индекс. Имате ИЛИ въз основа на датата чрез сравненията на дните. Така или иначе трябва да се използва за заявката.