Mysql
 sql >> Database >  >> RDS >> Mysql

Come creare più LEFT JOIN con OR utilizzare completamente un indice composito?

Dalla tua richiesta (formattazione leggibilità)

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)

A parte i tuoi contenuti restrittivi forniti, diamo un'occhiata al tuo tentativo di confrontare i dati dallo stesso giorno al giorno + 1, +2 e +3. Supponiamo anche che solo per questo esempio tu abbia solo 10 giorni nella tabella rappresentati come tutti i giorni dal 1 giugno al 10 giugno 2016 in entrambe le tabelle Table1 E Table2.

Ancora una volta, questo presuppone che ogni tabella abbia tutte e 10 le date in questione solo per scopi semplicistici del motivo per cui così tanti record. Quindi, per la data della tabella 1 del 1 giugno 2016, si qualificherà con la tabella 2 (versione tb21) e restituirà DUE record. Uno per il 1 giugno e un altro per il 2 giugno. Quindi ora hai DUE record nel tuo risultato. Ora, lo fai di nuovo, unisciti a sinistra alla tabella 2 (versione tb22). Questa volta stai cercando 2 e 3 giorni fuori, di cui hai il 3 e 4 giugno nella tabella. Quindi stai ottenendo un risultato cartesiano. Quindi, per il record del 1 giugno nella tabella 1, ora hai 4 record come segue.

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

Ora, supponiamo che la tua tabella 2 abbia 3 voci il 2 giugno e 3 voci il 3 giugno e che i tuoi dati si gonfieranno. Questo è il motivo per cui devi fornire maggiori chiarimenti su ciò che stai cercando di fare.

Quindi, non avendo un vero contesto su ciò che stai cercando, ignora il fatto che non sta utilizzando perfettamente il tuo indice. Hai un OR basato sulla data tramite i confronti dei giorni. Dovrebbe comunque essere utilizzato per la query.