5

看看下面名为“文章”的 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 是最大数量。

实际的 Articles 表包含超过 10,000 个条目。

所以在这个例子中,我只希望返回 Articles.id 4 和 6。我一直在研究关键字 distinct 和 function max() 但似乎无法确定。

任何建议表示赞赏...

4

7 回答 7

6

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

(我进行了编辑以使他们的文字与您的情况相匹配。)

于 2009-08-20T11:50:52.103 回答
5

你需要一个子查询:

SELECT a.id, a.version
FROM articles a
WHERE a.version = (
    SELECT MAX(version)
    FROM articles b
    WHERE b.articleId = a.articleId
)
于 2009-08-20T11:28:41.993 回答
4

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

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

由于这不是相关子查询,因此它会非常快(与连接一样快或更快),因此您无需担心。但它会返回所有具有 max 的值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

于 2009-08-20T11:21:30.557 回答
1

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

于 2009-08-20T11:22:20.463 回答
1

也许是这样的:

select * from article where articleid in (select max(articleversion) from items)

于 2009-08-20T11:23:10.243 回答
1

你可以做

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

我不知道 MySQL 会用它执行,但 Oracle 和 SQL server 可以用它。

于 2009-08-20T11:23:36.670 回答
1

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

于 2011-12-30T13:54:42.193 回答