看看下面名为“文章”的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(),但似乎无法确定它。
任何赞赏的建议......
答案 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将花费你