A partir de votre requête (format de lisibilité)
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)
En plus de votre contenu restrictif fourni, regardons-nous essayer de comparer les données d'un jour à l'autre + 1, +2 et +3. Supposons également que pour cet exemple, vous n'avez que 10 jours dans la table représentée comme tous les 1er juin - 10 juin 2016 dans vos tables Table1 ET Table2.
Encore une fois, il s'agit d'une hypothèse selon laquelle chaque table contient les 10 dates en question uniquement à des fins simplistes de savoir pourquoi tant d'enregistrements. Ainsi, pour la table 1 date du 1er juin 2016, il se qualifiera avec la table 2 (version tb21) et renverra DEUX enregistrements. Un pour le 1er juin et un autre pour le 2 juin. Vous avez donc maintenant DEUX enregistrements dans votre résultat. Maintenant, vous refaites la jointure gauche à la table 2 (version tb22). Cette fois, vous recherchez 2 et 3 jours, dont vous avez les 3 et 4 juin dans le tableau. Vous obtenez donc un résultat cartésien. Ainsi, pour l'enregistrement du 1er juin dans le tableau 1, vous avez maintenant 4 enregistrements comme suit.
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
Maintenant, disons que votre table 2 a 3 entrées le 2 juin et 3 entrées le 3 juin et que vos données vont gonfler. C'est pourquoi vous devez fournir plus de précisions sur ce que vous essayez de faire.
Donc, n'ayant pas de vrai contexte sur ce que vous recherchez, ignorez le fait qu'il n'utilise pas parfaitement votre index. Vous avez un OU basé sur la date via les comparaisons de jour. Il devrait toujours être utilisé pour la requête de toute façon.