我有 SQL:
select
sub.id,
corr
from
(
select
m.id,
m.sent_time,
(case when m.to_user = '58' then m.from_user else m.to_user end) as corr
from
messages m
where
(
from_user = '58' OR
to_user = '58'
)
order by
m.sent_time desc
) as sub
group by
sub.corr
order by
sent_time DESC
在我继承的一个网站的源代码中。 SQL 检索消息 ID 以及与登录用户发送消息或从登录用户发送消息的通信对方的用户 ID(在本例中为用户 ID 58)。
此时的查询始终返回用户 (58) 和另一个用户之间最旧的消息 ID。 通过使用 send_time DESC 更改顺序并没有改变这一点。
我可能遗漏了一些明显的东西 - 但是如何通过更改此查询来获取最新消息而不是最旧消息的消息 ID?
最佳答案
您的查询没有给出您想要的结果,因为一旦您使用GROUP BY
,它就会为所有未聚合的列选择随机值。我认为你可以简化你的查询来避免这个问题:
SELECT id,
CASE WHEN to_user = '58' THEN from_user ELSE to_user END AS corr
FROM messages m
WHERE (to_user = 58 OR from_user = 58) AND
sent_time = (SELECT MAX(sent_time)
FROM messages m1
WHERE m1.to_user = 58 OR m1.from_user = 58)
关于mysql - 使用子查询进行奇怪的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52776111/