Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer plusieurs LEFT JOIN avec OU utiliser pleinement un index composite?

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.