Detta kan förenklas till följande (
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.