在MySQL中查找id最大值的行

时间:2009-08-20 11:16:21

标签: mysql aggregate-functions max

看看下面名为“文章”的MySQL表:

+----+-----------+---------+------------------------+--------------------------+
| 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 |
+----+-----------+---------+------------------------+--------------------------+

我试图提出一个查询来返回Articles.id,其中Articles.version是最大数字。

实际的文章表包含10,000多个条目。

所以在这个例子中,我只想要返回Articles.id 4和6。 我一直在寻找关键字distinct和函数max(),但似乎无法确定它。

任何赞赏的建议......

7 个答案:

答案 0 :(得分:5)

MySQL manual开始,这就是诀窍:

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;

来自链接手册:

  

LEFT JOIN的工作原理是当 s1.price a1.version 处于最大值最小值,没有 s2.price a2.version 更大 较小的值,因此相应的 s2.article a2.articleId 值为NULL

(我编辑了他们的文字符合您的情况。)

答案 1 :(得分:4)

您可以在此处使用子查询:

select
    a.id
from
    articles a
where
    a.version = (select max(version) from articles)

由于这不是一个相关的子查询,它会非常快(比连接快或快),所以你不必担心。但它会返回所有具有最大articleid的值。

当然,我建议你在articleid上抛出一个索引(假设id已经聚集在一起)。这将有助于它更快地返回。

如评论中所述,如果您想获得每个articleid的最高版本,您可以执行以下操作:

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

这将创建该子查询的连接,并且通常比为每个articleid选择最大值的相关子查询快得多。

答案 2 :(得分:4)

您需要在此处进行子查询:

SELECT a.id, a.version
FROM articles a
WHERE a.version = (
    SELECT MAX(version)
    FROM articles b
    WHERE b.articleId = a.articleId
)

答案 3 :(得分:1)

SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)

答案 4 :(得分:1)

可能是这样的:

从articleid中选择*(从文章中选择max(articleversion))

答案 5 :(得分:1)

你可以做到

SELECT articles.id
  FROM articles a
 WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)

我不知道MySQL会用它来执行,但Oracle和SQL服务器都可以使用它。

答案 6 :(得分:1)

以上所有答案都可以解决DJDonaL3000所述的问题。但是,它们中的大多数都是相关的子查询,这会阻碍应用程序的性能。如果您正在使用云应用程序,我建议不要使用上述查询。最好的方法是维护两个表,A和B. A总是包含文章的最新版本,B包含所有版本的详细信息。问题是表中会有更多的更新和插入,但是由于你只需要在表A中执行正常的选择查询,因此获取速度会更快。在内部查询中执行group by和max将花费你