To lze zjednodušit na následující (ORDER BY
v poddotazu je k ničemu):
SELECT *
FROM table
GROUP BY title
Proč si myslíte, že potřebujete JOIN
? (Dobře, bylo to vyřešeno komentáři).
Po vašem komentáři, který potřebujete pro každý titul, řádek s největším časovým razítkem, by to fungovalo:
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
Pro záznam, váš původní dotaz:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
možná fungovat podle očekávání, ale:pouze v MySQL, který vám umožňuje použít v SELECT
seznam polí, která nejsou v GROUP BY
klauzule (nebo na nich závisí), bez jakýchkoli agregačních funkcí v nich. Výše uvedený dotaz tedy vrátí víceméně náhodný řádek pro každý titul. Ve skutečnosti vrátí první řádek, který najde pro titul. Po prvním spuštění dílčího dotazu (který se řadí podle timestamp DESC
) vede k nalezení prvního řádku s největším časovým razítkem.
K tomu však dochází pouze proto, že (kdy, pokud) optimalizátor nechápe, že poddotaz je k ničemu. Možná zjistíte, že váš původní dotaz běží dobře, když jednoho dne upgradujete na MySQL verzi 7.5 a váš dotaz přestane fungovat jako předtím. (protože optimalizátor byl chytřejší a přeložil váš dotaz na jednodušší bez podvýběru).
Pokud se MySQL v budoucí verzi rozhodne, že bude v souladu se standardy SQL pro GROUP BY
, můžete dokonce zjistit, že váš dotaz úplně přestane fungovat a způsobí chybu. dotazy.