【问题标题】:Selecting latest conversations from table containing private messages从包含私人消息的表中选择最新对话
【发布时间】:2013-05-20 01:36:56
【问题描述】:

我有一张表格,其中包含从一个用户到另一个用户的个人消息。

这是表结构:

mysql> describe pms;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| time    | datetime     | NO   |     | NULL    |                |
| from    | int(11)      | NO   |     | NULL    |                |
| from_ip | int(11)      | NO   |     | NULL    |                |
| to      | int(11)      | NO   |     | NULL    |                |
| message | varchar(255) | NO   |     | NULL    |                |
| read    | tinyint(4)   | NO   |     | 0       |                |
+---------+--------------+------+-----+---------+----------------+

我正在创建一个显示特定用户 ID 的 10 个最新对话的视图。由于我想找到对话,我想到了使用 GROUP BY from, to。但是,这会返回重复的行(来自该用户和该用户),而且我还注意到排序无法正常工作。

为了能够正确排序结果并因此选择 10 个最新对话,组应包含组的最新行而不是第一行。

这是我尝试过的查询:

SELECT * 
FROM  `pms` 
WHERE  `from` = 1
OR  `to` = 1
GROUP BY  `from` ,  `to` 
ORDER BY  `id` DESC 
LIMIT 10

这从组中给出了错误的行,因此按 id(或时间)排序会给出错误的顺序。

有什么想法可以让它工作吗?

【问题讨论】:

标签: mysql group-by


【解决方案1】:

这假设会话由 from-to 对以任一顺序定义,并且最新的会话具有最大的 id:

SELECT least(`from`,  `to`), greatest(`from`, `to`)
FROM  `pms` 
WHERE  `from` = 1 OR  `to` = 1
GROUP BY  least(`from`,  `to`), greatest(`from`, `to`)
ORDER BY max( `id`) DESC 
LIMIT 10

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多