从包含私人消息的表中选择最新的对话

时间:2013-05-19 17:32:16

标签: mysql group-by

我有一个包含从一个用户到另一个用户的个人消息的表。

这是表结构:

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 fromto。但是,这会返回重复的行(来自此用户和此用户),并且我还注意到排序不能正常工作。

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

这是我试过的查询:

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

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

我有什么想法让它发挥作用?

1 个答案:

答案 0 :(得分:0)

这假定会话由任意顺序的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