sql >> Database >  >> RDS >> Mysql

SQL Self-join met gegevensvergelijking voor verschillende dagen

U krijgt dubbele kolommen omdat u, zoals u die hebt, een query uitvoert vanuit T1 EN T2. Dus tenzij je expliciet zegt laat me alleen T1.* zien, worden kolommen uit BEIDE tabelaliasverwijzingen gehaald.

Aangezien uw zoekopdracht een OK doet op de datums, krijgt u waarschijnlijk ook een Cartesiaans resultaat.

Je kent nu je tabelstructuur, maar misschien ben je beter met een expliciete vraag, zoiets als...

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' 

Zorg voor een index op uw "my_table" op basis van (dag, kwaliteit) om de zoekopdracht te optimaliseren. En je kunt gewoon in paren de kolommen blijven toevoegen die je probeert te vergelijken tussen dag1 en dag2. T1 retourneert alleen de items die zijn gekoppeld aan de eerste dag en de T2-alias wordt alleen weergegeven voor overeenkomende items voor de tweede datum.

Als er nu alleen vermeldingen zijn aan de T1-zijde zonder corresponderende T2-invoer voor de kwaliteit en datum in kwestie, maar u wilt die toch zien, verander dan gewoon de JOIN in een LEFT JOIN.




  1. Hoe u uw PostgreSQL-database kunt beveiligen - 10 tips

  2. Hoe phpMyAdmin te installeren

  3. MySQL-prestaties van uniek varchar-veld versus unieke bigint

  4. MySQL LEFT JOIN slechts 1 rij afhankelijk van MAX() waarde