我有以下代码,我试图将消息分组
这是数据库表的图片以及组应该如何
这是SQL语句
SELECT a.* FROM `user_messages` `a`
JOIN (
SELECT `sender`, MAX(`id`) `last_id` FROM `user_messages` WHERE `receiver` = '1' GROUP BY `sender`
) `b`
ON `a`.`sender` = `b`.`sender` AND `a`.`id` = `b`.`last_id`
WHERE `a`.`receiver` = '1'
ORDER BY `id` DESC
我想以某种方式得到最后一条记录"接收器"不是我的身份,而是"发件人"并且将接收者列命名为" id"或者其他的东西。 ...所以我想要的是以下结果:
id | msg
13852 123
48 Hello!
17 321
答案 0 :(得分:1)
这是一个非常常见的用例。有几种方法可以编写此代码。根据所使用的SQL引擎,它们的速度会有所不同。
我将使用相当通用的列名。根据需要调整。
SELECT common_id, msg
FROM myTable outerTable
WHERE NOT EXISTS
( SELECT *
FROM myTable innerTable
WHERE innerTable.common_id = outerTable.common_id
AND innerTable.time > outerTable.time
)
请注意,如果有两行具有相同的common_id
和time
列,则两者都会显示在输出中。您可以将>
替换为>=
以隐藏这两行。
另一种常见的方法很难理解,但这里有。请注意与NOT EXISTS
方法的相似之处。
SELECT outerTable.common_id, outerTable.msg
FROM myTable outerTable
LEFT JOIN myTable innerTable
ON innerTable.common_id = outerTable.common_id
AND innerTable.time > outerTable.time
WHERE innerTable.common_id IS NULL
答案 1 :(得分:1)
将我的通用答案映射到您的特定用例(使用示例1):
SELECT receiver AS id, msg
FROM user_messages outerTable
WHERE NOT EXISTS
( SELECT *
FROM user_messages innerTable
WHERE innerTable.sender = outerTable.sender
AND innerTable.receiver = outerTable.receiver
AND innerTable.added > outerTable.added
)
AND sender = 1
答案 2 :(得分:0)
根据你的描述,你似乎想要这样的东西:
select um.receiver as id, um.msg
from user_messages um
where um.sender = 1 and
um.id = (select max(um2.id)
from user_messages um2
where um2.msg = um.msg and um2.receiver <> 1 and um.sender = 1
);
它不会产生所需的输出,但这是因为输出与文本描述不一致。