mysql - 私有(private)消息系统。列出每个对话的最后一条消息

标签 mysql sql

假设这是数据库结构:

enter image description here

SELECT * FROM `pms` where id_to = 1 or id_from = 1

这将返回他收到或发送的所有消息,

那么我如何从用户 1 可能拥有的每个对话中检索最后一条消息?

PD:当两个用户之间有一条或多条消息时,我称之为对话

-编辑-

因此给定此数据库内容:

enter image description here

我们想得到id 4和6

最佳答案

假设 id 是一个自增列:

SELECT MAX(id) AS id
FROM pms
WHERE id_to = 1 OR id_from = 1
GROUP BY (IF(id_to = 1, id_from, id_to))

假设您有 id_fromid_to 索引,这种变体很可能会执行得更好,因为 MySQL 不知道如何处理 OR:

SELECT MAX(id) AS id FROM
(SELECT id, id_from AS id_with
FROM pms
WHERE id_to = 1
UNION ALL
SELECT id, id_to AS id_with
FROM pms
WHERE id_from = 1) t
GROUP BY id_with

以下是获取这些 ID 的消息的方法:

SELECT * FROM pms WHERE id IN
    (SELECT MAX(id) AS id FROM
    (SELECT id, id_from AS id_with
    FROM pms
    WHERE id_to = 1
    UNION ALL
    SELECT id, id_to AS id_with
    FROM pms
    WHERE id_from = 1) t
    GROUP BY id_with)

关于mysql - 私有(private)消息系统。列出每个对话的最后一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160243/

相关文章:

sql - 表中列的类型不能用作索引中的键列

mysql - 创建具有两个不同外键的表

Python MySqlDB 没有得到更新的行

mysql - 我可以在 openshift 中每个档位拥有多个数据库吗?

php - 如何更新 CodeIgniter 更新中的特定字段?

sql - 检索每个组中的最后一条记录-MySQL

sql - 分解 SQL 代码 - MS SQL Server

php - 无法根据从 php 列表框中获取的值获取 mysql 记录

php - 如何使用mysql停止php中的空组

sql - 将数据从一个表复制到另一个表并同时添加另一列