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

Mysql 私人信息系统。列出每个对话的最后一条消息,mysql,sql,Mysql,Sql,假设这是数据库结构: SELECT * FROM `pms` where id_to = 1 or id_from = 1 这将返回他收到或发送的所有消息 那么,如何从用户1可能拥有的每个对话中检索最后一条消息呢 PD:当两个用户之间有一条或多条消息时,我称之为对话 -编辑- 鉴于此数据库内容: 我们希望获得id 4和6此查询应该可以: SELECT a.* FROM pms a INNER JOIN ( SELECT id_to, id_fro

假设这是数据库结构:

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

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

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

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

-编辑-

鉴于此数据库内容:


我们希望获得id 4和6

此查询应该可以:

SELECT a.*
FROM pms a
     INNER JOIN (
                 SELECT id_to, id_from, MAX(fecha) AS fecha
                 FROM pms
                 WHERE (id_to = 1 OR id_from = 1)
                 GROUP BY LEAST(id_to, id_from)
                ) b
                ON a.fecha = b.fecha AND
                   (a.id_to = b.id_to OR
                   a.id_from = b.id_from);

如果您有
id
作为
PRIMARY KEY
并按时间顺序记录消息,则可以进一步优化并简化为:

SELECT a.*
FROM pms a
     INNER JOIN (
                 SELECT MAX(id) AS id
                 FROM pms
                 WHERE (id_to = 1 OR id_from = 1)
                 GROUP BY LEAST(id_to, id_from)
                ) b
                ON a.id = b.id;

这假设
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\u from
id\u 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)

报告了以下错误:每个派生表都必须有自己的别名OHH ok。。用于派生表
b
的属性。已更新查询,请立即尝试。天哪。。。报告了以下错误:where子句中的“id_to”列不明确。NOW works但给出了每个对话的每个用户的最后一条消息。很接近了,但我们只需要每个对话的最后一条消息问题是,每个对话会有2条消息,我只需要最后一条..这显示了每个对话用户的最后一条消息。很接近了,但我们只想知道每个人的最后一条信息conversation@ToniMichelCaubet,这真的是你要用的吗?你的更适合我?唯一的原因是因为我必须将所有其他行添加到查询中,并将max(id)重命名为id@马库萨·丹斯沃克斯好的!但将“按id分组到+id分组从”替换为:“按总和分组”。这是冗余的:((pms.id_to+pms.id_from)=t.sum_id)”,也就是“其中pms.id_to=1或pms.id_from=1”是冗余的;如果把它也去掉,代码就会短得多/效率高得多。这似乎是可行的!我会给它一点测试,让你知道。谢谢@ToniMichelCaubet,另一个返回整个消息的更新。我不会告诉。。你可以想象,我不是sql高手。另外,我的数据库只有很少的记录。。顺便说一句,我正在使用它;)
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
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)