【问题标题】:MySQL only one message (the latest) per user in my inboxMySQL 在我的收件箱中每个用户只有一条消息(最新消息)
【发布时间】:2012-12-20 00:35:27
【问题描述】:

请帮助我,我只想在收件箱中为每个用户显示一条消息(最新消息)。 因此,如果我与 user1user2user3 交换消息, 而不是像这样在收件箱中显示他们的所有消息:

user2 - message 6
user3 - message 5
user2 - message 4
user1 - message 3
user1 - message 2
user1 - message 1

我只需要像这样在我的收件箱中显示他们每个人的最新消息。

user2 - message 6
user3 - message 5
user1 - message 3

这是我的桌子。

+-----------------------------------------------------------------------------------+
|                                      messages                                     |
+-----------------------------------------------------------------------------------+
| message_ID | sender |receiver| date | subject | body | unread | delete1 | delete2 |
+-----------------------------------------------------------------------------------+

+---------------------+
|        members      |
+---------------------+
| id | username | ... 
+----+----------+-----+

到目前为止,这是我的查询。

SELECT p.*, p.sender as sender, m.*
FROM  messages p
LEFT JOIN members m ON p.sender=m.member_id
WHERE p.receiver='<CURRENT_USER>' AND delete2=0
GROUP BY p.sender ORDER BY p.date DESC
LIMIT 5

【问题讨论】:

  • 请发布您的 SQL 而不使用构建它的代码以提高可读性。
  • 这是 PHP 吗?然后添加适当的标签
  • 首先,SELECT p.*, p.sender as sender, 你会得到名称/别名不明确的错误。什么设置了消息列的顺序?
  • 尝试使用 max(p.date) 而不是按它排序。
  • 只是想知道,为什么会有相同的question?是作业吗?

标签: mysql messages


【解决方案1】:
    SELECT p.*, p.sender as sender, m.*
      FROM `messages` p
INNER JOIN (SELECT sender, 
                   MAX(message_ID) as last_message_id
              FROM `messages` 
             WHERE receiver='<CURRENT_USER>' AND delete2=0
          GROUP BY `sender`) t2 ON t2.sender = p.sender 
                               AND t2.last_message_id = p.message_ID
 LEFT JOIN members m ON p.sender = m.member_id
     WHERE receiver='<CURRENT_USER>' AND delete2=0
  ORDER BY p.date DESC
     LIMIT 5

【讨论】:

  • 非常感谢..这个有效!我很感谢你是我的救星!
【解决方案2】:

你可以通过不同的函数来获得它,比如

 select  MAX(message_id)   

编辑。

试试这个

 SELECT p.*, p.sender as sender, m.*
 FROM  messages p
 inner join (select max(message_ID) lates from messages)as max on
 max.lates = p.message_ID
 LEFT JOIN members m ON p.sender=m.member_id
 WHERE p.receiver='<CURRENT_USER>' AND delete2=0
 GROUP BY p.sender ORDER BY p.date DESC
 LIMIT 5

【讨论】:

  • 我试过了,只显示了一条记录.. :( SELECT MAX(p.message_id), p.*, p.sender as sender, m.* FROM messages p LEFT JOIN members m ON p.sender=m.member_id WHERE p.receiver='&lt;CURRENT_USER&gt;' AND delete2=0 GROUP BY p.sender ORDER BY p.date DESC LIMIT 5
  • user1 和 user2 and ... 是发送者还是接收者?
  • 假设我是 user4,我从 user1、user2、user3 收到这些消息。
  • 出现错误。说明:“组声明”中的未知列“p.sender”
  • 描述:“字段列表”中的未知列“p.message_id”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多