sql >> Databáze >  >> RDS >> Mysql

struktura mysql pro komentáře a odpovědi na komentáře

Pokud chcete, aby lidé mohli odpovídat na odpovědi (tj. mít hierarchii odpovědí, jakou vidíte například v online fóru zpráv), přidal bych do tabulky komentářů volitelné pole parent_comment_id.

Váš stůl by vypadal takto

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

Váš dotaz zobrazující všechny komentáře a odpovědi by byl něco jako:

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

Všimněte si však, že s tímto dotazem by se vaše odpovědi také zobrazily nejen ve sloupci 'odpověď', ale také ve sloupci 'komentář' jako další řádky, každý s nulou nebo více odpověďmi.

Chcete-li zobrazit uživatelská jména uživatelů, kteří odpověděli na komentář, budete se muset dvakrát připojit k tabulce uživatelů (nejprve pro uživatele, který zveřejnil původní komentář, a znovu pro uživatele, kteří odpověděli). Zkuste tento dotaz pro zobrazení uživatelských jmen uživatelů, kteří odpověděli:

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. Omezit levé spojení na vrácení jednoho výsledku?

  2. Nejste to vy, to jsem já (odstraňování problémů s I/O)

  3. IGNORE_DUP_KEY pomalejší na seskupených indexech

  4. Nové funkce Oracle Database 20c