sql >> Databasteknik >  >> RDS >> Mysql

SQL Self-join med datajämförelse för olika dagar

Du får duplicerade kolumner eftersom du, som du har det, frågar från T1 OCH T2. Så om du inte uttryckligen säger visa mig bara T1.* kommer det att ta kolumner från BÅDA tabellaliasreferenser.

Eftersom din fråga gör en ELLER på datumen kommer du förmodligen också att få ett kartesiskt resultat.

Nu känner du till din tabellstruktur, men du kanske är bättre med en explicit fråga i stil med...

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' 

Ha ett index på din "my_table" baserat på (dag, kvalitet) för att optimera frågan. Och du kan bara fortsätta lägga till i par, kolumnerna du försöker jämföra mellan dag1 och dag2. T1 returnerar bara de som är kopplade till den första dagen, och T2-aliaset visas endast för matchande poster för det andra datumet.

Om det nu bara finns poster på T1-sidan utan motsvarande T2-post för kvaliteten och datumet i fråga, men du fortfarande vill se dem, ändra bara JOIN till en LEFT JOIN.




  1. Gruppvis maximalt

  2. Ta bort objekt i NESTED JSONB-arrayer med PostgreSQL

  3. sqlalchemy, ställer in MySQL-teckenuppsättningen som `create_engine`-argument

  4. Hur visar jag schemat för en tabell i en MySQL-databas?