我需要你的帮助。基本上,我试图从我的表中获取唯一值。我有三个表:会话,conversation_messages和用户。
对话表:
conversation_id user_id friend_id
1 1 2
2 6 1
3 1 7
4 1 3
Conversations_Messages表:
cm_id conversation_id sender_id recipient_id message
1 1 1 2 Hello!
2 1 2 1 Hi!
3 1 1 2 Hola!
4 2 6 1 Ola!
5 2 1 6 Gutentag!
6 3 1 7 Eow
7 4 1 3 Eophu
用户表:
user_id name
1 Test
2 Pat
6 Ela
7 Sophia
这是我尝试过的:
SELECT c.conversation_id, cm.message,
CONCAT(u.firstname, ' ', u.lastname) AS sender,
CONCAT(u2.firstname, ' ', u2.lastname) AS recipient
FROM `conversations` AS c
JOIN conversation_messages AS cm
ON c.conversation_id = cm.conversation_id
JOIN users AS u
ON cm.sender_id = u.user_id
JOIN users AS u2
ON cm.recipient_id = u2.user_id
WHERE c.user_id = 1
GROUP BY cm.conversation_id
结果:
conversation_id message sender recipient
1 Hello! Test Pat
2 Ola! Ela Test
3
etc...
我收到了结果,但第一条消息正在退回。我需要返回最新的(通过cm_Id)消息。有任何想法吗?我很乐意感激你的帮助!
答案 0 :(得分:1)
而不是简单的" FROM ... JOIN ..."使用类似的东西
FROM `conversations` AS c
JOIN (
SELECT MAX(cm_id) max_id, conversation_id
FROM conversation_messages
GROUP BY conversation_id
) cm_last ON (cm_last.conversation_id = c.conversation_id)
JOIN conversation_messages cm ON (cm.cm_id = cm_last.max_id)
它会为每个对话找到最后一个cm_id,然后使用该ID加入完整的conversation_messages,而不是第一个。
答案 1 :(得分:0)
如果我理解了你的问题,你可以通过在最后添加“ORDER BY cm.cm_id DESC”来实现这个目的。