sql >> Base de Datos >  >> RDS >> Mysql

ORDER BY Subconsulta para GROUP BY para JOIN conversión

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