Dit kan worden vereenvoudigd tot het volgende (de ORDER BY
in de subquery is nutteloos):
SELECT *
FROM table
GROUP BY title
Waarom denk je dat je JOIN
nodig hebt? ? (Ok, dit is opgelost door opmerkingen).
Na je opmerking die je voor elke titel nodig hebt, de rij met de grootste tijdstempel, zou dit het werk doen:
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
Voor de goede orde, uw oorspronkelijke vraag:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
misschien werken zoals verwacht, maar:alleen in MySQL waarmee u kunt gebruiken in de SELECT
lijstvelden die niet in de GROUP BY
. staan clausule (of daarvan afhankelijk zijn), zonder enige geaggregeerde functies erin. Dus de bovenstaande zoekopdracht retourneert een min of meer willekeurig rij voor elke titel. In feite zal het de eerste rij retourneren die het voor een titel zal vinden. Dus, na eerst de subquery te hebben uitgevoerd (die wordt besteld op timestamp DESC
) resulteert in het vinden van de rij met de grootste tijdstempel.
Dit gebeurt echter alleen omdat (wanneer, als) de optimizer niet begrijpt dat de subquery nutteloos is. Het kan zijn dat uw oorspronkelijke zoekopdracht goed werkt wanneer u op een dag een upgrade uitvoert naar MySQL-versie 7.5 en uw zoekopdracht niet meer werkt zoals voorheen. (omdat de optimizer slimmer is geworden en uw zoekopdracht naar een eenvoudigere heeft vertaald zonder subselectie).
U kunt zelfs merken dat uw zoekopdracht helemaal niet meer werkt en fouten oplevert als MySQL in een toekomstige release besluit om in overeenstemming te zijn met de SQL-standaarden voor de GROUP BY
vragen.