Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann man mehrere LEFT JOINs mit OR erstellen, um einen zusammengesetzten Index vollständig zu verwenden?

Aus Ihrer Abfrage (lesbar formatiert)

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)

Abgesehen von Ihren restriktiven Inhalten, schauen wir uns an, wie Sie versuchen, die Daten von Tag zu Tag + 1, +2 und +3 zu vergleichen. Nehmen wir auch an, dass Sie nur für dieses Beispiel nur 10 Tage in der Tabelle haben, die sowohl in Ihren Tabellen Table1 als auch in Table2 als 1. Juni bis 10. Juni 2016 dargestellt werden.

Auch dies ist eine Annahme, dass jede Tabelle alle 10 fraglichen Daten enthält, nur um zu vereinfachen, warum so viele Datensätze vorhanden sind. Für das Datum von Tabelle 1 vom 1. Juni 2016 wird es also mit Tabelle 2 (tb21-Version) qualifiziert und ZWEI Datensätze zurückgegeben. Einen für den 1. Juni und einen für den 2. Juni. Jetzt haben Sie also ZWEI Datensätze in Ihrem Ergebnis. Jetzt machen Sie das noch einmal mit der linken Verknüpfung zu Tabelle 2 (tb22-Version). Diesmal suchen Sie 2 und 3 Tage aus, von denen Sie den 3. und 4. Juni in der Tabelle haben. Sie erhalten also ein kartesisches Ergebnis. Für den Datensatz vom 1. Juni in Tabelle 1 haben Sie nun 4 Datensätze wie folgt.

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

Nehmen wir nun an, Ihre Tabelle 2 hat am 2. Juni 3 Einträge und am 3. Juni 3 Einträge, und Ihre Daten werden extrem aufgebläht. Aus diesem Grund müssen Sie näher erläutern, was Sie zu tun versuchen.

Wenn Sie also keinen wahren Kontext zu dem haben, wonach Sie suchen, ignorieren Sie die Tatsache, dass Ihr Index nicht perfekt genutzt wird. Über die Tagesvergleiche haben Sie ein OR auf Basis des Datums. Es sollte trotzdem für die Abfrage verwendet werden.