Dette kan forenkles til følgende (
SELECT *
FROM table
GROUP BY title
Hvorfor tror du, at du har brug for JOIN
? (Ok, dette blev løst med kommentarer).
Efter din kommentar, som du har brug for til hver titel, rækken med det største tidsstempel, ville dette gøre arbejdet:
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
For en god ordens skyld, din oprindelige forespørgsel:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
måske arbejde som forventet, men:kun i MySQL, der giver dig mulighed for at bruge i SELECT
liste felter, der ikke er i GROUP BY
klausul (eller afhænger af dem), uden nogen aggregerede funktioner i dem. Så ovenstående forespørgsel vil returnere en mere eller mindre tilfældig række for hver titel. Faktisk vil den returnere den første række, den finder for en titel. Så efter først at have kørt underforespørgslen (som sorterer efter tidsstempel DESC
) resulterer i først at finde rækken med det største tidsstempel.
Dette sker dog kun, fordi (når, hvis) optimeringsværktøjet ikke forstår, at underforespørgslen er ubrugelig. Du kan opleve, at din oprindelige forespørgsel kører fint, når du en dag opgraderer til MySQL version 7.5, og din forespørgsel holder op med at fungere som før. (fordi optimeringsværktøjet blev mere smart og oversatte din forespørgsel til en enklere uden undervalg).
Du kan endda finde ud af, at din forespørgsel helt stopper med at fungere og producerer fejl, hvis MySQL i en fremtidig udgivelse beslutter at være i overensstemmelse med SQL-standarderne for GROUP BY
forespørgsler.