私人消息系统.列出每个对话的最后一条消息

Ton*_*bet 8 mysql sql

让我们说这是数据库结构:

在此输入图像描述

SELECT * FROM `pms` where id_to = 1 or id_from = 1
Run Code Online (Sandbox Code Playgroud)

这将返回他已经收到或发送的所有邮件,

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

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

-编辑-

所以鉴于此数据库内容:

在此输入图像描述

我们想获得id 4和6

Mar*_*ams 7

这假设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))
Run Code Online (Sandbox Code Playgroud)

假设你已经id_fromid_to索引,这种变化很可能会表现得更好,因为MySQL不知道做什么用的或做的事:

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
Run Code Online (Sandbox Code Playgroud)

以下是如何获取这些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)
Run Code Online (Sandbox Code Playgroud)