MySQL,如何从消息列表中选择对话

MySQL,如何从消息列表中选择对话,mysql,sql,Mysql,Sql,我有以下代码: SELECT a.id, a.to_id, a.from_id, a.seen, a.date, a.message FROM `Chat_messages` a INNER JOIN ( SELECT MAX( `id` ) AS id FROM `Chat_messages` AS `alt` WHERE `alt`.`to_id` =7 OR `alt`.`from_id` =7 GROUP BY `to_id`

我有以下代码:

SELECT a.id, a.to_id, a.from_id, a.seen, a.date, a.message

FROM  `Chat_messages` a

INNER JOIN (
    SELECT MAX(  `id` ) AS id
    FROM  `Chat_messages` AS  `alt` 
    WHERE  `alt`.`to_id` =7
    OR  `alt`.`from_id` =7
    GROUP BY  `to_id` ,  `from_id`
)b ON a.id = b.id
返回:

所以,我想获得用户发送和接收的对话信息以及最新的信息。 最新消息工作正常,但问题是,我从收到的消息1和2中获得了2行,从发送的消息3和4中获得了2行,但我只需要2个结果,因为有2个对话

您可以按leastto_id、from_id、greatestto_id、from_id进行分组,以确保合并两个人之间的转换:

SELECT a.id, a.to_id, a.from_id, a.seen, a.date, a.message

FROM  `Chat_messages` a

INNER JOIN (
    SELECT MAX(  `id` ) AS id
    FROM  `Chat_messages` AS  `alt` 
    WHERE  `alt`.`to_id` =7
    OR  `alt`.`from_id` =7
    GROUP BY  least(`to_id` ,  `from_id`), greatest(`to_id` ,  `from_id`)
)b ON a.id = b.id
您可以按leastto_id、from_id、greatestto_id、from_id进行分组,以确保合并两个人之间的转换:

SELECT a.id, a.to_id, a.from_id, a.seen, a.date, a.message

FROM  `Chat_messages` a

INNER JOIN (
    SELECT MAX(  `id` ) AS id
    FROM  `Chat_messages` AS  `alt` 
    WHERE  `alt`.`to_id` =7
    OR  `alt`.`from_id` =7
    GROUP BY  least(`to_id` ,  `from_id`), greatest(`to_id` ,  `from_id`)
)b ON a.id = b.id

选择分别保存最新发送消息的行和保存最新接收消息的行的最佳方法是使用row_number窗口函数。不幸的是,MySql不支持窗口函数,因此我认为最好使用两个嵌套的SELECT:

SELECT z.id, max(z.to_id), max(z.from_id), max(z.seen), max(z.date), max(z.message)
FROM chat_messages z
LEFT JOIN 
(SELECT x.from_id, max(date) date
FROM chat_messages x
GROUP BY x.from_id) f
ON z.from_id = f.from_id AND z.date = f.date
LEFT JOIN
(SELECT y.to_id, max(date) date
FROM chat_messages y
GROUP BY y.to_id) t
ON z.to_id = t.to_id AND z.date = t.date
GROUP BY z.id

如果您关心长期的正确性,我不建议在ID上使用max。

分别选择保存最新发送消息的行和保存最新接收消息的行的最佳方法是使用行号窗口功能。不幸的是,MySql不支持窗口函数,因此我认为最好使用两个嵌套的SELECT:

SELECT z.id, max(z.to_id), max(z.from_id), max(z.seen), max(z.date), max(z.message)
FROM chat_messages z
LEFT JOIN 
(SELECT x.from_id, max(date) date
FROM chat_messages x
GROUP BY x.from_id) f
ON z.from_id = f.from_id AND z.date = f.date
LEFT JOIN
(SELECT y.to_id, max(date) date
FROM chat_messages y
GROUP BY y.to_id) t
ON z.to_id = t.to_id AND z.date = t.date
GROUP BY z.id

如果您关心长期的正确性,我不建议使用max on ID。

谢谢,但我在on子句中得到了1054-未知列“t.date”有什么想法吗?谢谢你给我的身份证,小费。我错过了。忘记给max列命名了。现在修好了。我想现在它不会返回任何行。您需要使用左连接,然后在外部select中的所有列上使用max函数删除空值。我马上更新。刚刚更新了答案。这是我能很快想到的,因为我现在需要睡觉。希望有帮助!谢谢,但我在“on子句”中得到了1054-未知列“t.date”,你知道吗?谢谢你给我的身份证,小费。我错过了。忘记给max列命名了。现在修好了。我想现在它不会返回任何行。您需要使用左连接,然后在外部select中的所有列上使用max函数删除空值。我马上更新。刚刚更新了答案。这是我能很快想到的,因为我现在需要睡觉。希望有帮助!