用于获取消息的SQL语句

时间:2016-05-25 17:17:00

标签: mysql sql

我有以下代码,我试图将消息分组

这是数据库表的图片以及组应该如何

enter image description here

这是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

输出: enter image description here

我想以某种方式得到最后一条记录"接收器"不是我的身份,而是"发件人"并且将接收者列命名为" id"或者其他的东西。 ...所以我想要的是以下结果:

id    |   msg
13852      123
48         Hello!
17         321

这是一个小提琴:http://sqlfiddle.com/#!9/e06d57/3/0

3 个答案:

答案 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_idtime列,则两者都会显示在输出中。您可以将>替换为>=以隐藏这两行。

另一种常见的方法很难理解,但这里有。请注意与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
              );

它不会产生所需的输出,但这是因为输出与文本描述不一致。