gpt4 book ai didi

mysql - 如何获取每个组中的最新记录并检查它是否是唯一的记录?

转载 作者:行者123 更新时间:2023-11-29 01:28:57 26 4
gpt4 key购买 nike

根据 this answer ,获取每组最新记录的最佳方式是这样的:

SELECT m1.*
FROM messages m1
LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id)
WHERE m2.id IS NULL

我试过了,效果很好。

但是,我还需要检查最新的记录是否是组中的唯一记录。我尝试将查询修改为:

SELECT m1.*, COUNT(m3.name)
FROM messages m1
LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id)
LEFT JOIN messages m3 ON m1.name = m3.name
WHERE m2.id IS NULL

但它只返回一行。

如果我删除 COUNT() 语句,则留给我们的是:

SELECT m1.*
FROM messages m1
LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id)
LEFT JOIN messages m3 ON m1.name = m3.name
WHERE m2.id IS NULL

返回了重复的行,显然额外的 LEFT JOIN 打乱了查询。

有没有一种简单的方法来检查返回的最新记录是否是组中唯一的记录?一个简单的 bool 值就可以了,或者组中的记录数也可以。

编辑:我尝试这样做的原因是我正在编写一个评论系统,我希望用户能够编辑评论。编辑评论时,我想显示一个链接,显示它已被编辑,单击该链接后,您将转到显示编辑的页面(例如在 facebook 上,或者修订系统如何处理 stackoverflow 上的问题)。所以我需要获得每个评论的最新修订版,以及一个让我知道评论是否有多个修订版的指示器(这样我就知道是否显示“已编辑”链接)。解决方案需要高效,因为一个线程中可能有数百条评论。

最佳答案

尝试:

SELECT m1.*, m2.total
FROM messages m1,
(select max(id) id, count(*) total, name
from messages
group by name) m2
where m1.name = m2.name and m1.id = m2.id

如果需要,您可以将其转换为连接语法,但想法是运行子查询并连接一次而不是两次,并且仅使用相等连接,这可以提高性能。我会对我的解决方案和 Aquillo 的解决方案进行基准测试,看看哪个在您的情况下更快。

关于mysql - 如何获取每个组中的最新记录并检查它是否是唯一的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com