我有一个简单的Web应用程序,允许用户互相发送消息,用户可以查看他们的收件箱以查看他们的消息。收件箱应按发件人分组,按发件人最新邮件的日期排序,也可按收件箱读取状态排序。
我认为我的查询工作正常,但我刚注意到某些消息的排序不正确!我非常确定它是由于该组返回任何消息...无论如何都在这周围?
看看这个小提琴: http://sqlfiddle.com/#!2/565c6/1
已排序收件箱的最后一条消息,实际上是收件箱视图底部的最新消息!
答案 0 :(得分:2)
我认为你正在寻找一个群体性的最大化:
SELECT *
FROM who_messages wm1
WHERE wm1.sent = (
SELECT MAX(sent)
FROM who_messages wm2
WHERE wm2.from_userid = wm1.from_userid
AND wm2.to_userid = 41
)
ORDER BY wm1.is_read ASC, wm1.sent DESC;
或者,没有相关的子查询:
SELECT *
FROM who_messages wm1
JOIN (
SELECT from_userid, MAX(sent) as sent
FROM who_messages
WHERE to_userid = 41
GROUP BY from_userid
) wm2 ON wm1.from_userid = wm2.from_userid AND wm1.sent = wm2.sent
ORDER BY wm1.is_read ASC, wm1.sent DESC;
答案 1 :(得分:0)
你的意思是这样的? http://sqlfiddle.com/#!2/565c6/20 我只是在子查询中按ID反向排序。
答案 2 :(得分:-1)
如果对发件人进行排序或者是否总是将其过滤到特定的发件人,您是否期望对结果进行排序/分组并不是特别清楚?
交换
m.sent DESC
代表
m.sent ASC
将最新消息带到您小提琴的结果顶部。