Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Subconsulta ORDER BY para conversão de GROUP BY para JOIN


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.