Isso pode ser simplificado para o seguinte (o
ORDER BY
na subconsulta é inútil):SELECT *
FROM table
GROUP BY title
Por que você acha que precisa de
JOIN
? (Ok, isso foi resolvido por comentários). Após o seu comentário que você precisa para cada título, a linha com o maior timestamp, isso faria o trabalho:
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
Para o registro, sua consulta original:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
pode funcionar como esperado, mas:somente no MySQL que permite usar no
SELECT
listar campos que não estão no GROUP BY
cláusula (ou dependem daqueles), sem quaisquer funções agregadas neles. Portanto, a consulta acima retornará um mais ou menos aleatório linha para cada título. Na verdade, ele retornará a primeira linha que encontrar para um título. Então, tendo executado primeiro a subconsulta (que ordena por timestamp DESC
) resulta em encontrar primeiro a linha com o maior timestamp. Isso, porém, só acontece porque (quando, se) o otimizador não entende que a subconsulta é inútil. Você pode descobrir que sua consulta original funciona bem quando um dia você atualizar para o MySQL versão 7.5 e sua consulta parar de funcionar como antes. (porque o otimizador ficou mais inteligente e traduziu sua consulta para uma mais simples sem sub-selecionar).
Você pode até descobrir que sua consulta pare de funcionar completamente e produza erros se o MySQL decidir em uma versão futura estar em termos de padrões SQL para o
GROUP BY
consultas.