订单通过不处理已连接和分组的MySQL表

时间:2014-09-09 16:20:10

标签: php mysql sql

我想要实现的目标:我正在尝试构建私人消息传递脚本。令我困惑的脚本部分是在两个用户之间显示消息。我想显示他们之间发送的最后一条消息

我的问题:当我在一个PHP / MySQL查询中执行3个连接然后使用GROUP BY和ORDER BY DESC时,我希望显示该对话的最后一条消息...但是第一个一个出现了。

我的代码结构:我有三个MySQL表;用户(持有用户登录信息),消息(保存任何消息的内容)和对话(保存关于对话者之间的信息):

USERS表:

 user_id | user_name
 1       | Dave
 2       | Bill
 3       | Rob

CONVERSATIONS表:

 conversation_id | user_one_id | user_two_id
 1               | 1           | 2 

消息表:

 message_id | conversation_id | sender_user_id | receiver_user_id | message
 1          | 1               | 1              | 2                | Hey how are you?
 2          | 1               | 2              | 1                | Not bad. You?
 3          | 1               | 1              | 2                | Okay

我有以下MySQL查询:

 SELECT u.user_name, c.conversation_id, m.sender_user_id, m.message
 FROM conversations c
 JOIN messages m ON c.conversation_id=m.conversation_id
 JOIN users u ON u.user_id=m.sender_id
 WHERE c.user_one_id=$user_id AND m.sender_user_id<>:$user_id
 GROUP BY u.user_name
 ORDER BY m.message_id DESC

输出:当我提供$ user_id = 2且echo user_name且消息为:

 Dave: Hey how are you?

而不是显示最后一条记录:

 Dave: okay

1 个答案:

答案 0 :(得分:1)

在没有聚合的情况下使用group将导致不确定的订单,它不会保证您可以使用自联接来选择每个转换的最新消息的最新或最早的订单

SELECT u.user_name, c.conversation_id, m.sender_user_id, m.message
 FROM conversations c
 JOIN messages m ON c.conversation_id=m.conversation_id
 JOIN users u ON u.user_id=m.sender_user_id
JOIN (select max(message_id) message_id ,conversation_id
     from messages 
      group by conversation_id
     ) m1
ON(m.message_id= m1.message_id and m.conversation_id = m1.conversation_id)
 WHERE .....
 ORDER BY m.message_id DESC 

Demo