Как написать SQL в этой ситуации? - PullRequest
0 голосов
/ 15 октября 2018

Комментарий таблицы содержит комментарий и его ответы

CREATE TABLE `comment` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `comment` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) 

Таблица reply_to с response_id и comment_id, оба из которых являются идентификаторами записей в таблице комментариев.

CREATE TABLE `reply_to` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `response_id` int(11) NOT NULL, 
  `comment_id` int(11) NOT NULL, 
  PRIMARY KEY (`id`)
)  

Если комментарий к таблице содержит данные, подобные следующим:
enter image description here

И таблица reply_to содержит
enter image description here

И ожидаемый результат, например:
enter image description here

Вопрос: Как я могу отобразить все комментарии и их ответы, используя левое внешнее объединение?

Этот вопрос возник с этой страницы

Дизайн базы данных для комментариев и ответов Почему здесь не работает sql ниже?

 SELECT c.comment, r.comment as reply
 FROM Comment c 
 LEFT OUTER JOIN Comment r on c.id = r.id  
 LEFT OUTER JOIN reply_to rt on rt.response_id = r.id

1 Ответ

0 голосов
/ 15 октября 2018

До сих пор не совсем ясно, как вы хотите, чтобы результаты выглядели, но исходный запрос (тот, в который включены ANSI-89) из сообщения, на которое вы ссылались, дает ожидаемые результаты:

enter image description here

Поэтому я переписал этот запрос с правильными объединениями, и он выглядит так:

SELECT
    oc.comment,
    rc.comment
FROM
    comment oc
INNER JOIN
    reply_to r
    ON r.comment_id = oc.id
INNER JOIN
    comment rc
    ON r.response_id = rc.id

Если вы хотите видеть комментарии без ответа:

enter image description here

тогда вы можете использовать левые внешние соединения следующим образом:

SELECT
    oc.comment,
    rc.comment
FROM
    comment oc
LEFT OUTER JOIN
    reply_to r
    ON r.comment_id = oc.id
LEFT OUTER JOIN
    comment rc
    ON r.response_id = rc.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...