Nếu bạn muốn mọi người có thể trả lời các câu trả lời (tức là có một hệ thống phân cấp các câu trả lời như bạn sẽ thấy trong một diễn đàn tin nhắn trực tuyến), thì tôi sẽ thêm một trường parent_comment_id tùy chọn vào bảng nhận xét.
Bảng của bạn sẽ giống như thế này
`CREATE TABLE IF NOT EXISTS `comments` (
`id` int(12) NOT NULL AUTO_INCREMENT,
`parent_comment_id` int(12) NULL,
`comment` text,
`user_id` int(12) DEFAULT NULL,
`topic_id` int(12) NOT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `topic_id` (`topic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;`
Truy vấn của bạn hiển thị tất cả các nhận xét và câu trả lời sẽ giống như sau:
SELECT c.id, c.comment, r.comment as reply, c.user_id, u.username, u.photo
FROM (comments c)
JOIN users u ON c.user_id = u.id
LEFT JOIN comments r ON c.id = r.parent_comment_id
WHERE c.topic_id = 9
Tuy nhiên, lưu ý rằng với truy vấn này, câu trả lời của bạn cũng sẽ không chỉ hiển thị trong cột 'trả lời' mà còn hiển thị trong cột 'nhận xét' dưới dạng các hàng bổ sung, mỗi hàng không có hoặc nhiều câu trả lời.
Để hiển thị tên người dùng của những người dùng đã trả lời một nhận xét, bạn sẽ cần tham gia hai lần vào bảng người dùng (lần đầu tiên đối với người dùng đã đăng nhận xét ban đầu và một lần nữa đối với (những) người dùng đã trả lời). Hãy thử truy vấn này để hiển thị tên người dùng của những người dùng đã trả lời:
SELECT c.id, c.comment, c.user_id, u.username, u.photo, r.comment as reply, r.user_id as reply_user_id,
u2.username as reply_username, u2.photo as reply_photo
FROM (comment c)
JOIN users u ON c.user_id = u.id
LEFT JOIN comments r ON c.id = r.parent_comment_id
JOIN users u2 ON r.user_id = u2.id
WHERE c.topic_id = 9