我有一个包含从一个用户到另一个用户的个人消息的表。
这是表结构:
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(或时间)排序会给出错误的顺序。
我有什么想法让它发挥作用?
答案 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