![](/img/trans.png)
[英]Selecting max value while group by two columns with order on another column
[英]Find the max value of a column, then group by another column in same table
我有一个与此处解决的问题类似的问题,但是当我尝试该解决方案时,我认为它失败了,因为我将事情设置的不同。
我有一个带有...的文档表(不幸的是,由于它是旧系统,因此无法编辑该表)
+-------+--------+----------+--------+
| Docid | title | revision | linkid |
+-------+--------+----------+--------+
| 1 | docone | 1 | 1 |
| 2 | doctwo | 1 | 2 |
| 3 | docone | 2 | 1 |
|4 | docone | 3 | 1 |
+-------+--------+----------+--------+
在列出所有文档的页面上,我只想列出每个文档的最新修订版。 例如,Doc1在修订版3上,因此我想要一个,而不是其他2。Doc2仅在修订版1上,所以请显示一个。
基于另一篇文章中的问题,我将查询编写如下:
$query_docs = "
SELECT `document`.*, doctype.*
FROM `document`
INNER JOIN doctype
ON `document`.iddoctypes = doctype.iddoctypes
WHERE `document`.revision = (
SELECT MAX(`document`.revision) AS revision
FROM `document`
)
GROUP BY `document`.linkid
ORDER BY `document`.doccreation DESC";
我不得不链接到另一个表来获取文档类型(只是为了使查询更困难)。
只是一个疯狂的猜测:我认为您必须在(select max(...) ...)
子查询中group by title
添加group by title
。
因此,完整的声明将是这样的:
$query_docs = "
SELECT `document`.*, doctype.*
FROM `document`
INNER JOIN doctype
ON `document`.iddoctypes = doctype.iddoctypes
WHERE `document`.revision = (
SELECT MAX(`document`.revision) AS revision
FROM `document`
--GROUP BY `document`.title
GROUP BY `document`.linkid
)
GROUP BY `document`.linkid
ORDER BY `document`.doccreation DESC";
试试这个,我做了几个小改动
SELECT document.*, doctype.*
FROM document
INNER JOIN doctype
ON document.iddoctypes = doctype.iddoctypes
WHERE document.revision = (
SELECT MAX(d1.revision)
FROM document d1
WHERE document.linkid = d1.linkid
)
ORDER BY document.doccreation DESC
我想念什么吗? 这似乎很简单...
SELECT x.*
FROM my_table x
JOIN (SELECT title,MAX(revision) max_revision FROM my_table GROUP BY title) y
ON y.title = x.title
AND y.max_revision = x.revision;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.