【发布时间】:2016-10-17 07:14:31
【问题描述】:
我正在编写一个 MySQL (MariaDB) 查询来获取用户从中收到消息的发件人列表。就像在 Facebook 收件箱中一样,我希望最近的发件人首先出现,我已经通过以下查询:
SELECT DISTINCT user_id_s
FROM messages
WHERE id IN (
SELECT MAX(id)
FROM messages
WHERE user_id_r=390
GROUP BY user_id_s
)
order by id DESC
它似乎工作得很好(不确定它是否能很好地处理像一百万行这样的大记录?)。但真正的问题是,如果用户收到最后一条消息而不是最后一条回复,它只会按顺序获取。
例子:
用户 390 已按此顺序收到以下用户的消息:
- 385
- 421
- 422
- 423
- 424
- 429
- 430
- 431
所以现在用户 431 是最新的并显示在列表顶部,但如果用户 390 回复了用户 431,它会停留在底部,而我希望根据上次交互显示在顶部。
我希望我解释得很好。
编辑:这是一个 SQL 小提琴:http://sqlfiddle.com/#!9/82417/2
在此示例中,带有“573”的行 ID 应出现在顶部,替换第 572 行,其余结果必须保持不变。同样具有 user_id_s 的第二列应该在第一行给出“431”,就像现在一样。
【问题讨论】:
-
因为您是按 id 订购的,即
order by id DESC。恕我直言,选择永远不会解决问题,也不会扩展。解决这个问题的正确方法是创建动态逻辑,以静态方式将消息置于期望序列中。 -
@mootmoot 您能否详细说明“动态逻辑”部分?一个例子?
-
将此可视化为纸质文件系统。将排序和插入消息的方式转换成各自的序列到插入逻辑中。