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

MySQL:controle qué fila devuelve un grupo por

Se llama seleccionar el máximo por grupo de una columna. Aquí hay varios enfoques diferentes para mysql.

Así es como lo haría:

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

Esto será relativamente eficiente, aunque mysql creará una tabla temporal en la memoria para la subconsulta. Supongo que ya tiene un índice en (id, version_id) para esta tabla.

Es una deficiencia en SQL que más o menos tienes que usar una subconsulta para este tipo de problema ( semi-uniones son otro ejemplo).

Las subconsultas no están bien optimizadas en mysql, pero las subconsultas no correlacionadas no son tan malas siempre que no sean tan grandes que se escriban en el disco en lugar de en la memoria. Dado que en esta consulta solo tiene dos enteros, la subconsulta podría tener millones de filas mucho antes de que eso sucediera, pero la subconsulta select * en su primera consulta podría sufrir este problema mucho antes.