Encuentra la fila con el valor máximo de ID en MySQL
-
19-09-2019 - |
Pregunta
Tome un vistazo a la tabla de MySQL a continuación llamados "artículos":
+----+-----------+---------+------------------------+--------------------------+
| id | articleId | version | title | content |
+----+-----------+---------+------------------------+--------------------------+
| 1 | 1 | 0.0 | ArticleNo.1 title v0.0 | ArticleNo.1 content v0.0 |
| 2 | 1 | 1.0 | ArticleNo.1 title v1.0 | ArticleNo.1 content v1.0 |
| 3 | 1 | 1.5 | ArticleNo.1 title v1.5 | ArticleNo.1 content v1.5 |
| 4 | 1 | 2.0 | ArticleNo.1 title v2.0 | ArticleNo.1 content v2.0 |
| 5 | 2 | 1.0 | ArticleNo.2 title v1.0 | ArticleNo.2 content v1.0 |
| 6 | 2 | 2.0 | ArticleNo.2 title v2.0 | ArticleNo.2 content v2.0 |
+----+-----------+---------+------------------------+--------------------------+
Estoy tratando de llegar a una consulta para devolver Articles.id donde Articles.version es el número máximo.
La tabla de los artículos reales contiene más de 10.000 entradas.
Así que en este ejemplo sólo quiero Articles.id 4 y 6 para ser devueltos. He estado buscando en el máximo de palabra clave distinta y la función (), pero no puede parecer a clavarlo.
Cualquier sugerencia apreció ...
Solución
Es necesario una consulta sub aquí:
SELECT a.id, a.version
FROM articles a
WHERE a.version = (
SELECT MAX(version)
FROM articles b
WHERE b.articleId = a.articleId
)
Otros consejos
Desde el MySQL manual de , esto hace el truco:
SELECT a1.id
FROM Articles a1
LEFT JOIN Articles a2 ON a1.articleId = a2.articleId AND a1.version < a2.version
WHERE a2.articleId IS NULL;
Desde el manual vinculado:
El
LEFT JOIN
funciona sobre la base de que cuandos1.price
a1.version
es en sumáximamínimo valor, no es sins2.price
a2.version
con unmayormenor valor y por lo tanto el correspondientes2.article
a2.articleId
es el valorNULL
.
(He editado para que su texto se ajuste a su situación.)
Puede usar una sub consulta aquí:
select
a.id
from
articles a
where
a.version = (select max(version) from articles)
Dado que esto no es una consulta correlacionada, será bastante rápido (tan rápido o más rápido que un join), por lo que no tiene que preocuparse por eso. Pero va a devolver todos los valores que tienen el articleid
máx.
Por supuesto, me gustaría recomendar que usted lanza un índice en articleid
(id
suponiendo que ya está agrupado). Eso ayudará a que vuelva aún más rápido.
Como se ha señalado en los comentarios, si desea obtener la versión máximo para cada articleid
, puede hacer lo siguiente:
select
a.id
from
articles a
inner join (select articleid, max(version)
from articles group by articleid) as b on
a.articleid = b.articleid
and a.version = b.version
Esto creará una unión de ese sub consulta y por lo general será mucho más rápido que una consulta correlacionada que selecciona el máximo para cada articleid
.
SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)
tal vez algo como:
SELECT * FROM artículos en los que articleid en (select max (articleversion) de los artículos)
Puede hacer
SELECT articles.id
FROM articles a
WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)
No sé MySQL llevará a cabo con él, pero Oracle y SQL Server están muy bien con él.
Todas las respuestas anteriores pueden resolver el problema indicado DJDonaL3000 's. Sin embargo, la mayoría de ellos son sub consultas correlacionadas que dificultan el desempeño de la aplicación. Si está utilizando una aplicación en la nube a continuación, sugiero no utilizar las consultas anteriores. La mejor manera es, entonces, para mantener dos tablas, A y B. A que contienen siempre la última versión del artículo y B tienen los detalles de todas las versiones. La cuestión es que habrá más actualizaciones e inserciones en las tablas, pero será más rápido la zona de alcance tan sólo tiene que ejecutar una consulta de selección normal en la tabla A. Grupo que hace por y máximo en una consulta interna le costará