sql >> Databasteknik >  >> RDS >> Mysql

mysql-struktur för kommentarer och kommentarsvar

Om du vill att folk ska kunna svara på svaren (dvs. ha en hierarki av svar som du skulle se i t.ex. ett meddelandeforum online), så skulle jag lägga till ett valfritt parent_comment_id-fält i kommentarstabellen.

Ditt bord skulle se ut så här

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

Din fråga som visar alla kommentarer och svar skulle vara något i stil med:

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

Observera dock att med den här frågan skulle dina svar också dyka upp inte bara i "svar"-kolumnen, utan också i "kommentar"-kolumnen som ytterligare rader var och en med noll eller fler svar.

För att visa användarnamnet för användarna som svarade på en kommentar måste du gå med två gånger i användartabellen (först för användaren som postade den ursprungliga kommentaren och igen för användaren/användarna som svarade). Prova den här frågan för att visa användarnamnen för de användare som svarade:

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


  1. Felaktig användning av UNION och ORDER BY?

  2. Om du använder indexerade vyer och MERGE, läs detta!

  3. Ändra ett SQL Server Agent Job (T-SQL)

  4. Förbereda en MySQL- eller MariaDB-server för produktion - del ett