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

MySQL - Controla qual linha é retornada por um grupo por


Chama-se selecionar o máximo de grupo de uma coluna. Aqui estão várias abordagens diferentes para o mysql.

Aqui está como eu faria:
SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id

Isso será relativamente eficiente, embora o mysql crie uma tabela temporária na memória para a subconsulta. Suponho que você já tenha um índice em (id, version_id) para esta tabela.

É uma deficiência no SQL que você mais ou menos precisa usar uma subconsulta para esse tipo de problema ( semijunções são outro exemplo).

As subconsultas não são bem otimizadas no mysql, mas as subconsultas não correlacionadas não são tão ruins, desde que não sejam tão grandes que sejam gravadas no disco em vez da memória. Dado que nesta consulta tem apenas dois ints, a subconsulta pode ter milhões de linhas muito antes disso acontecer, mas a subconsulta select * em sua primeira consulta pode sofrer com esse problema muito mais cedo.