找到在MySQL ID的最大值排
-
19-09-2019 - |
题
看看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被返回。 的Ive寻找关键字distinct和函数max(),但不能似乎钉它。
任何建议理解...
解决方案
您在这里需要一个子查询:
SELECT a.id, a.version
FROM articles a
WHERE a.version = (
SELECT MAX(version)
FROM articles b
WHERE b.articleId = a.articleId
)
其他提示
从 MySQL手册,这是卓有成效的:
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
。
(我编辑,以使他们的文字你的情况相符。)
您可以在这里使用子查询:
select
a.id
from
articles a
where
a.version = (select max(version) from articles)
由于这不是一个相关子查询,这将是非常快(快或比join快),所以你不必担心。但它会返回所有具有最大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
相关子查询快得多。
SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)
也许是这样的:
SELECT * FROM物品,其中在条款ArticleID(选择从物品MAX(articleversion))
您可以做
SELECT articles.id
FROM articles a
WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)
我不知道MySQL将使用它进行,但Oracle和SQL服务器都与它的罚款。
所有上述答案可能解决DJDonaL3000的所述问题。但是,他们大多是阻碍了应用程序的性能相关子查询。如果您使用的是云应用的话,我建议不要使用上面的查询。那么最好的办法是保持两个表,A和所有版本的B.含有总是最新版本的文章,并具有B详细。问题是会有更多的更新和插入到表中,但获取会更快,因为只需要执行表A的正常选择查询的和最大的内部查询否则集团将花费你