[英]Get last comment for each chat room through GROUP By not working in MySql
我有一个简单的聊天系统。 在该聊天系统中,用户可以看到已发送给他的评论。 我只想在每个聊天室中显示最后(一个)评论,但不适用于我的查询。 所以请帮助我取得适当的结果
表定义:
CREATE TABLE users (
`user_id` int,
`user_name` varchar(55)
);
CREATE TABLE chat_room (
`chat_room_id` int,
`description` varchar(55)
);
CREATE TABLE chat_room_comments (
`comment_id` int,
`chat_room_id` int,
`sender_id` int,
`comment` varchar(55),
`send_to` int,
`read_status` tinyint
);
和数据:
INSERT INTO users
(`user_id`, `user_name`)
VALUES
(1, 'The Rock'),
(2, 'Dwayne'),
(3, 'Johnson')
;
INSERT INTO chat_room
(`chat_room_id`, `description`)
VALUES
(1, 'Room 1'),
(2, 'Room 2'),
(3, 'Room 3')
;
INSERT INTO chat_room_comments
(`comment_id`,`chat_room_id`, `sender_id`,`comment`, `send_to`,`read_status`)
VALUES
(1,1,2, 'Room 1 Hello The Rock',1,0),
(2,1,1, 'Hello Dwayne',2,0),
(3,1,3, 'Hello Dwayne',2,0),
(4,2,1, 'Hello Johnson',3,0),
(5,2,3, 'Hello Dwayne',2,0),
(6,2,2, 'Room 2 Hello The Rock',1,0),
(7,3,1, 'Hello Johnson',3,0),
(8,3,3, 'Room 3 Hello The Rock',1,0),
(9,3,3, 'Room 3 Hello The Rock',1,0),
(10,3,2, 'Hello Johnson',3,0)
;
我的查询(按我的要求不能正常工作):
SELECT * FROM chat_room CR
LEFT JOIN chat_room_comments CRC ON CRC.chat_room_id = CR.chat_room_id
LEFT JOIN users U ON U.user_id = CRC.sender_id
WHERE
CRC.send_to = 1
GROUP BY CRC.comment_id
ORDER BY CRC.comment_id DESC
查询结果:
预期结果:
首先,您需要获取每个chat_room_id的最后comment_id
SELECT chat_room_id, MAX(comment_id) as last_comment_id FROM chat_room_comments
WHERE send_to = 1 GROUP BY chat_room_id
然后使用此结果来联接其他数据
SELECT CR.*, CRC.* , U.*
FROM chat_room_comments CRC
JOIN (
SELECT chat_room_id, MAX(comment_id) as last_comment_id FROM chat_room_comments
WHERE send_to = 1 GROUP BY chat_room_id
) LCRC ON CRC.chat_room_id = LCRC.chat_room_id AND CRC.comment_id = LCRC.last_comment_id
JOIN chat_room CR ON CRC.chat_room_id = CR.chat_room_id
LEFT JOIN users U ON U.user_id = CRC.sender_id
ORDER BY CRC.comment_id DESC
要么
SELECT CR.*, CRC.* , U.*
FROM chat_room_comments CRC
JOIN chat_room CR ON CRC.chat_room_id = CR.chat_room_id
LEFT JOIN users U ON U.user_id = CRC.sender_id
WHERE CRC.comment_id IN (SELECT MAX(comment_id) as last_comment_id FROM chat_room_comments
WHERE send_to = 1 GROUP BY chat_room_id)
ORDER BY CRC.comment_id DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.