繁体   English   中英

通过不在MySQL中工作,通过GROUP获得每个聊天室的最新评论

[英]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

查询结果:

在此处输入图片说明

预期结果:

在此处输入图片说明

SqlFiddle

首先,您需要获取每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM