0

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

这是表结构:

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 (或时间)排序会给出错误的顺序。

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

4

1 回答 1

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
于 2013-05-19T17:36:56.803 回答