Questo può essere semplificato come segue (il ORDER BY
nella sottoquery è inutile):
SELECT *
FROM table
GROUP BY title
Perché pensi di aver bisogno di JOIN
? (Ok, questo è stato risolto dai commenti).
Dopo il tuo commento di cui hai bisogno per ogni titolo, la riga con il timestamp più grande, questo farebbe il lavoro:
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
Per la cronaca, la tua domanda originale:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
potrebbe funziona come previsto, ma:solo in MySQL che ti consente di utilizzare in SELECT
elenca i campi che non sono nel GROUP BY
clausola (o dipendono da quelle), senza alcuna funzione aggregata in esse. Quindi, la query sopra restituirà un più o meno casuale riga per ogni titolo. In effetti, restituirà la prima riga che troverà per un titolo. Quindi, dopo aver eseguito prima la sottoquery (che ordina per timestamp DESC
) trova per prima la riga con il timestamp più grande.
Questo, tuttavia, accade solo perché (quando, se) l'ottimizzatore non capisce che la sottoquery è inutile. Potresti scoprire che la tua query originale funziona correttamente quando un giorno esegui l'aggiornamento a MySQL versione 7.5 e la tua query smette di funzionare come prima. (perché l'ottimizzatore è diventato più intelligente e ha tradotto la tua query in una più semplice senza sottoselezionare).
Potresti anche scoprire che la tua query smette di funzionare del tutto e produce un errore se MySQL decide in una versione futura di essere in termini di standard SQL per GROUP BY
interrogazioni.