sql >> Databasteknik >  >> RDS >> Mysql

ORDER BY Subquery för GROUP BY to JOIN-konvertering

Detta kan förenklas till följande (ORDER BY i underfrågan är värdelös):

SELECT * 
FROM table
GROUP BY title

Varför tror du att du behöver JOIN ? (Ok, detta löstes med kommentarer).

Efter din kommentar som du behöver för varje titel, raden med största tidsstämpel, skulle detta göra jobbet:

SELECT t.* 
FROM
    table AS t
  JOIN
    ( SELECT title
           , MAX(timestamp) AS maxts
      FROM table
      GROUP BY title
    ) AS grp
    ON grp.title = t.title
    AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC

För att ta reda på, din ursprungliga fråga:

SELECT * 
FROM 
  ( SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
  ) m
GROUP BY title

kanske fungerar som förväntat, men:bara i MySQL som låter dig använda i SELECT lista fält som inte finns i GROUP BY sats (eller beror på dessa), utan några aggregerade funktioner i dem. Så ovanstående fråga returnerar en mer eller mindre slumpmässig rad för varje titel. I själva verket kommer den att returnera den första raden den hittar för en titel. Så, efter att först ha kört underfrågan (som sorteras efter tidsstämpel DESC ) resulterar i att först hitta raden med störst tidsstämpel.

Detta händer dock bara för att (när, om) optimeraren inte förstår att underfrågan är värdelös. Du kanske upptäcker att din ursprungliga fråga fungerar bra när du en dag uppgraderar till MySQL version 7.5 och din fråga slutar fungera som tidigare. (eftersom optimeraren blev smartare och översatte din fråga till en enklare utan underval).

Du kan till och med upptäcka att din fråga slutar fungera helt och ger fel om MySQL i en framtida version bestämmer sig för att vara i enlighet med SQL-standarder för GROUP BY frågor.



  1. Perl DBI - kör SQL-skript med flera satser

  2. Oracle lagrad procedur:returnera både resultatuppsättning och utparametrar

  3. Övervaka använda anslutningar på mysql för att felsöka "för många anslutningar"

  4. Kombinera två kolumner och lägg till en ny kolumn