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ó ...

¿Fue útil?

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 cuando s1.price a1.version es en su máxima mínimo valor, no es sin s2.price a2.version con un mayor menor valor y por lo tanto el correspondiente s2.article a2.articleId es el valor NULL.

(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á

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top