Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fazer vários LEFT JOINs com OR usar totalmente um índice composto?


Da sua consulta (formatado para legibilidade)
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)

Além do conteúdo restritivo fornecido, vejamos você tentando comparar os dados do mesmo dia + 1, +2 e +3. Vamos também supor apenas para este exemplo que você tenha apenas 10 dias na tabela representada como todos os dias 1 a 10 de junho de 2016 em ambas as tabelas Table1 E Table2.

Novamente, isso é uma suposição de que cada tabela tem todas as 10 datas em questão apenas para fins simplistas de por que tantos registros. Assim, para a data da Tabela 1 de 1º de junho de 2016, ela se qualificará com a tabela 2 (versão tb21) e retornará DOIS registros. Um para 1º de junho e outro para 2 de junho. Então agora você tem DOIS registros em seu resultado. Agora, você faz isso novamente à esquerda para a tabela 2 (versão tb22). Desta vez você está procurando 2 e 3 dias de folga, dos quais você tem 3 e 4 de junho na tabela. Então você está obtendo um resultado cartesiano. Portanto, para o registro de 1º de junho na tabela 1, agora você tem 4 registros da seguinte forma.
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

Agora, digamos que sua tabela 2 tenha 3 entradas em 2 de junho e 3 entradas em 3 de junho e seus dados ficarão super inchados. É por isso que você precisa fornecer mais esclarecimentos sobre o que está tentando fazer.

Portanto, não tendo um contexto verdadeiro sobre o que você está procurando, ignore o fato de que não está utilizando perfeitamente seu índice. Você tem um OR com base na data por meio das comparações de dias. Ele ainda deve utilizar para a consulta de qualquer maneira.