Ако искате хората да могат да отговарят на отговорите (т.е. да имат йерархия от отговори, каквато бихте виждали, да речем, в онлайн форум за съобщения), тогава бих добавил незадължително поле parent_comment_id към таблицата с коментари.
Вашата таблица ще изглежда така
`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 ;`
Вашата заявка, показваща всички коментари и отговори, би била нещо като:
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
Имайте предвид обаче, че с тази заявка вашите отговори също ще се покажат не само в колоната „отговор“, но и в колоната „коментар“ като допълнителни редове, всеки с нула или повече отговори.
За да покажете потребителското име на потребителите, които са отговорили на коментар, ще трябва да се присъедините два пъти към таблицата с потребители (първо за потребителя, който е публикувал оригиналния коментар, и отново за потребителя(ите), които са отговорили). Опитайте тази заявка, за да покажете потребителските имена на потребителите, които са отговорили:
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