sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo hacer múltiples LEFT JOIN con O usar completamente un índice compuesto?

De su consulta (formato de legibilidad)

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)

Aparte del contenido restrictivo proporcionado, mirémoslo tratando de comparar los datos del mismo día a día + 1, +2 y +3. Supongamos también que solo para este ejemplo tiene solo 10 días en la tabla representados como todos del 1 de junio al 10 de junio de 2016 en sus tablas Table1 Y Table2.

Una vez más, esto es una suposición de que cada tabla tiene las 10 fechas en cuestión solo para propósitos simplistas de por qué tantos registros. Entonces, para la fecha de la Tabla 1 del 1 de junio de 2016, calificará con la tabla 2 (versión tb21) y devolverá DOS registros. Uno para el 1 de junio y otro para el 2 de junio. Ahora tiene DOS registros en su resultado. Ahora, haga eso nuevamente, únase a la izquierda a la tabla 2 (versión tb22). Esta vez está buscando 2 y 3 días, de los cuales tiene el 3 y 4 de junio en la tabla. Así que estás obteniendo un resultado cartesiano. Entonces, para el registro del 1 de junio en la tabla 1, ahora tiene 4 registros de la siguiente manera.

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

Ahora, digamos que su tabla 2 tiene 3 entradas el 2 de junio y 3 entradas el 3 de junio y sus datos se van a inflar. Es por eso que necesita proporcionar más aclaraciones sobre lo que está tratando de hacer.

Por lo tanto, al no tener un contexto real sobre lo que está buscando, ignore el hecho de que no está utilizando perfectamente su índice. Tiene un OR basado en la fecha a través de las comparaciones de días. Debería seguir utilizándose para la consulta de todos modos.