【问题标题】:Find the max value of a column, then group by another column in same table查找一列的最大值,然后按同一表中的另一列分组
【发布时间】:2013-05-26 07:29:20
【问题描述】:

我有与the one solved here 类似的问题,但当我尝试解决方案时,我认为它失败了,因为我的设置不同..

我有一个文档表... (不幸的是,由于是旧系统,无法编辑表格)

+-------+--------+----------+--------+
| 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";

我不得不链接到另一个表来获取文档类型(只是为了使查询更难)。

【问题讨论】:

  • 如果您先尝试从文档表中获取您想要的内容,然后再担心从 doctype 中添加额外的详细信息,您可能会发现这更容易。
  • 这只是将内部连接重新排序到子查询的括号之后吗?
  • 不是真的;更多的是您试图解决与从document 表中获取一些数据有关的问题。我建议您专注于这一点,在您弄清楚如何从 document 表中获取您想要的数据之前,不要担心为额外的数据添加额外的表。

标签: php sql web-applications


【解决方案1】:

试试这个,我做了几个小改动

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

【讨论】:

  • 谢谢 phil 但我想我应该提到 title 可以更改但 linkid 不能。
  • @DanielRobinson 我已经对其进行了更改,以便它基于linkid 而不是title 获取数据。它应该按预期工作(我希望!)
  • 抱歉回复晚了。非常感谢您的解决方案有效。不过我能问点什么吗。我不明白文档 d1 中的行。您是否将 doc 表的名称更改为 d1?有没有一些关于你做了什么的信息我可以读到?
  • 这里写着FROM document d1,我只是简单地将引用命名为一个表。在这种情况下,每当我写 d1.revision 时,它只是对 document.revision 的引用
【解决方案2】:

只是一个疯狂的猜测:我认为您必须在您的 (select max(...) ...) 子查询中添加 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";

【讨论】:

  • 不幸的是,标题可能会根据每个版本而改变。唯一永远不变的是linkid
  • 然后我的提示是用“group by linkid”替换“group by title”。我已经分别编辑了我的帖子。
【解决方案3】:

我错过了什么吗?这看起来很简单......

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;

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2016-07-10
    • 1970-01-01
    • 2020-08-21
    • 2021-07-25
    • 1970-01-01
    • 2017-11-27
    • 2012-02-14
    • 2021-02-10
    相关资源
    最近更新 更多