1

我有一个简单的 Web 应用程序,它允许用户互相发送消息,用户可以查看他们的收件箱以查看他们的消息。收件箱应按发件人分组,按来自该发件人的最新邮件的日期以及收件箱的阅读状态排序。

我认为我的查询工作正常,但是我刚刚注意到某些消息的顺序不正确!我很确定这是由于该组通过返回任何消息......无论如何这周围有吗?

看看这个小提琴: http ://sqlfiddle.com/#!2/565c6/1

已排序收件箱的最后一条消息,实际上有最新消息,但它位于收件箱视图的底部!

4

3 回答 3

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;

Sql 小提琴

或者,没有相关的子查询:

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;

Sql 小提琴

于 2013-02-13T22:26:01.610 回答
0

你的意思是这样的?http://sqlfiddle.com/#!2/565c6/20 我只是在子查询中按 ID 反向排序。

于 2013-02-13T22:25:50.757 回答
-1

目前尚不清楚您希望如何对结果进行排序/分组,应该对发件人进行排序还是总是将其过滤到特定的发件人?

交换

m.sent DESC

为了

发送 ASC

会将最新消息带到您小提琴结果的顶部。

于 2013-02-13T22:25:18.640 回答