看看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的正常选择查询的和最大的内部查询否则集团将花费你

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top