Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

estrutura mysql para comentários e respostas a comentários


Se você quiser que as pessoas possam responder às respostas (ou seja, ter uma hierarquia de respostas como você veria, digamos, em um fórum de mensagens online), então eu adicionaria um campo opcional parent_comment_id à tabela de comentários.

Sua mesa ficaria assim
`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 ;`

Sua consulta mostrando todos os comentários e respostas seria algo como:
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

Observe, no entanto, que com essa consulta suas respostas também apareceriam não apenas na coluna 'resposta', mas também na coluna 'comentário' como linhas adicionais, cada uma com zero ou mais respostas.

Para mostrar o nome de usuário dos usuários que responderam a um comentário, você precisará ingressar duas vezes na tabela de usuários (primeiro para o usuário que postou o comentário original e novamente para o(s) usuário(s) que respondeu). Tente esta consulta para mostrar os nomes de usuário dos usuários que responderam:
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