Mysql
 sql >> Database >  >> RDS >> Mysql

struttura mysql per commenti e risposte ai commenti

Se vuoi che le persone siano in grado di rispondere alle risposte (cioè avere una gerarchia di risposte come quella che vedresti, ad esempio, in un forum di messaggi online), aggiungerei un campo parent_comment_id facoltativo alla tabella dei commenti.

Il tuo tavolo sarebbe simile a questo

`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 ;`

La tua query che mostra tutti i commenti e le risposte sarebbe qualcosa del tipo:

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

Tieni presente, tuttavia, che con questa query le tue risposte verrebbero visualizzate non solo nella colonna "risposta", ma anche nella colonna "commento" come righe aggiuntive ciascuna con zero o più risposte.

Per mostrare il nome utente degli utenti che hanno risposto a un commento, dovrai iscriverti due volte alla tabella degli utenti (prima per l'utente che ha pubblicato il commento originale e di nuovo per gli utenti che hanno risposto). Prova questa query per mostrare i nomi utente degli utenti che hanno risposto:

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