Если вы хотите, чтобы люди могли отвечать на ответы (т. Е. Иметь иерархию ответов, такую как, например, на форуме сообщений), я бы добавил необязательное поле 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