我想要实现的目标:我正在尝试构建私人消息传递脚本。令我困惑的脚本部分是在两个用户之间显示消息。我想显示他们之间发送的最后一条消息
我的问题:当我在一个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
答案 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