gpt4 book ai didi

mysql - 改进子选择查询

转载 作者:行者123 更新时间:2023-11-29 04:26:09 25 4
gpt4 key购买 nike

有没有办法在没有子选择的情况下执行以下查询?

SELECT * FROM 
(
SELECT * FROM messaging_message WHERE recipient_id=4 ORDER BY timestamp DESC
) combined
GROUP BY thread_id HAVING status='unread'

表:

`messaging_message`
- id
- thread_id
- content
- sender_id
- recipient_id
- timestamp
- status

线程 ID 是消息的父线程。

更新:到目前为止,在测试这两个答案时,两个查询都没有生成我需要的结果。

查询应该只返回消息线程中最新消息 = '未读' 的那些结果。以下两个查询都返回任何线程的最顶部结果,该线程的消息状态为“未读”。

我正在尝试做的是类似于任何电子邮件收件箱的操作,例如 Gmail。假设收件箱在第一页上显示 25 个线程。我只想突出显示那些具有状态为“未读”的最新消息的线程(忽略比最新消息更早的任何消息的状态)。

这也是为什么我在排序的结果上使用 GROUP BY 的原因,这样我只能得到最新的结果,并且在这些结果中,查看哪个有 status='unread '

(请注意,我还将上述查询中的状态从“已删除”更改为“未读”,以便让解释更清楚。)

最佳答案

您的查询有点像 MySQL 黑客攻击。 SQL 标准不允许在该位置使用 order by。我什至不确定它是否会在 MySQL 中始终如一地工作。话虽如此,您的版本相当清晰,并且可能优于更严格的版本。

例如,编写查询的更正式的方式是:

select  *
from (
select distinct thread_id
from messaging_message
where recipient_id = 4
) thread
join messaging_message mm
on mm.id =
(
select mm2.id
from messaging_message mm2
where thead.thread_id = mm2.thread_id
order by
mm2.timestamp desc
limit 1
)
where mm.status = 'unread'

关于mysql - 改进子选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965558/

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