Как сделать комментарий ответом на запрос в MYSQL? - PullRequest
7 голосов
/ 02 июня 2009

У меня есть функция ответа на комментарий (только до одного уровня). Все комментарии могут содержать столько же ответов, но ни один из них не может иметь дальнейших ответов.

Итак, моя структура таблицы базы данных выглядит следующим образом

Id    ParentId    Comment
1     0           this is come sample comment text
2     0           this is come sample comment text
3     0           this is come sample comment text
4     1           this is come sample comment text
5     0           this is come sample comment text
6     3           this is come sample comment text
7     1           this is come sample comment text

В вышеприведенных структурах, commentid, 1 (имеет 2 ответа) и 3 (1 ответ) имеет ответы. Таким образом, чтобы получить комментарии и их ответы, один простой метод - сначала я выбираю все комментарии с ParentId равным 0, а затем, запустив цикл while, выбираю все ответы этого конкретного commentId. Но, похоже, это будет сотня запросов, если у меня будет около 200 комментариев к конкретной записи.

Итак, я хочу сделать запрос, который будет последовательно извлекать комментарии с их ответами следующим образом;

Id    ParentId    Comment
1     0           this is come sample comment text
4     1           this is come sample comment text
7     1           this is come sample comment text
2     0           this is come sample comment text
3     0           this is come sample comment text
6     3           this is come sample comment text    
5     0           this is come sample comment text

У меня также есть столбец даты комментария в моей таблице комментариев, если кто-то хочет использовать это с запросом комментария.

Итак, наконец, я хочу получить все комментарии и их ответы, используя один единственный запрос mysql. Скажите, пожалуйста, как я могу это сделать?

Спасибо

Ответы [ 3 ]

17 голосов
/ 02 июня 2009

Вы можете использовать выражение в ORDER BY. Попробуйте это:

SELECT *
FROM comments
ORDER BY IF(ParentId = 0, Id, ParentId), Id

Сначала выполняется сортировка по Id, если ParentId = 0, или по ParentId в противном случае. Второй критерий сортировки - это Id, гарантирующий, что ответы возвращаются по порядку.

1 голос
/ 02 июня 2009

Я настоятельно рекомендую вам реструктурировать схему базы данных. Основная проблема заключается в том, что вы пытаетесь рассматривать комментарии и ответы как одно и то же, а простые они - не одно и то же. Это заставляет вас делать некоторые сложные запросы.

Представьте, что у вас две таблицы: [КОММЕНТАРИИ: (идентификатор, текст)] и ответы на комментарии в другой таблице [ОТВЕТЫ (идентификатор, комментарий, текст)]. Проблема кажется намного, намного легче, если думать таким образом.

0 голосов
/ 30 декабря 2010

Если вы / кто-то ищете простое решение, тогда оно может быть полезным.

Изменение структуры - я полагаю, вы изменили его, добавив идентификатор блога. Если идентификатор блога отсутствует, как вы скажете, какие комментарии относятся к блогу?

Сначала сделайте это, это не повредит вашей базе данных,

update `tblcomments` set ParentId=Id where ParentId=0;

затем, чтобы получить комментарии блога и комментарии к комментариям по порядку (комментарий - ответ 1, ответ 2 ... под комментарием)

используйте запрос bleow

SELECT * 
FROM  tblcomments 
ORDER BY  ParentId ASC;

Cheers, -PM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...