Esto se puede simplificar a lo siguiente (el ORDER BY
en la subconsulta es inútil):
SELECT *
FROM table
GROUP BY title
¿Por qué crees que necesitas JOIN
? ? (Ok, esto fue resuelto por comentarios).
Después de su comentario de que necesita para cada título, la fila con la marca de tiempo más grande, esto haría el trabajo:
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 que conste, su consulta original:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
podría funciona como se esperaba, pero:solo en MySQL que le permite usar en el SELECT
listar campos que no están en el GROUP BY
cláusula (o dependen de ellos), sin ninguna función agregada en ellos. Entonces, la consulta anterior devolverá un más o menos aleatorio fila para cada título. De hecho, devolverá la primera fila que encontrará para un título. Entonces, habiendo ejecutado primero la subconsulta (que ordena por timestamp DESC
) da como resultado encontrar primero la fila con la marca de tiempo más grande.
Sin embargo, esto solo sucede porque (cuando, si) el optimizador no comprende que la subconsulta es inútil. Es posible que su consulta original funcione bien cuando un día actualice a la versión 7.5 de MySQL y su consulta deje de funcionar como antes. (porque el optimizador se volvió más inteligente y tradujo su consulta a una más simple sin subseleccionar).
Incluso puede encontrar que su consulta deja de funcionar por completo y produce un error si MySQL decide en una versión futura estar en términos de estándares SQL para GROUP BY
consultas