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

SQL Self-Join mit Datenvergleich für verschiedene Tage

Sie erhalten doppelte Spalten, weil Sie, wie Sie es haben, von T1 UND T2 abfragen. Wenn Sie also nicht ausdrücklich sagen, nur T1.* anzuzeigen, werden Spalten aus BEIDEN Tabellen-Alias-Referenzen abgerufen.

Da Ihre Abfrage ein ODER an den Daten durchführt, erhalten Sie wahrscheinlich auch ein kartesisches Ergebnis.

Jetzt kennen Sie Ihre Tabellenstruktur, aber Sie könnten besser mit einer expliziten Abfrage wie etwa ...

sein
SELECT
      t1.day,
      t2.day as OtherDay,
      t1.quality,
      t1.anotherColumn,
      t2.OtherAnotherColumn,
      t1.thirdColumn,
      t2.OtherThirdColumn
   FROM 
      my_table t1
         join my_table t2
            on t1.quality = t2.quality
           AND t2.day = '2015-01-09'
   where
      t1.day = '2015-01-08' 

Haben Sie einen Index für Ihre "my_table" basierend auf (Tag, Qualität), um die Abfrage zu optimieren. Und Sie können die Spalten, die Sie zwischen Tag1 und Tag2 vergleichen möchten, einfach paarweise hinzufügen. T1 gibt nur diejenigen zurück, die dem ersten Tag zugeordnet sind, und der T2-Alias ​​wird nur für übereinstimmende Einträge für das zweite Datum angezeigt.

Wenn nun nur Einträge auf der T1-Seite ohne entsprechenden T2-Eintrag für die fragliche Qualität und das betreffende Datum vorhanden sind, Sie diese aber trotzdem sehen möchten, dann ändern Sie einfach den JOIN in einen LEFT JOIN.