MySQL запрос для сортировки комментариев и их вложенных ответов - PullRequest
4 голосов
/ 03 мая 2011

Я прочитал более 10 связанных постов здесь и в других местах и ​​до сих пор не могу понять это, будучи довольно новым для php и MySQL:

Я использую WordPress и пытаюсь реализовать вложенные комментарии в старомтема.Моя таблица полностью настроена (назовем ее «комментарии») и имеет следующие поля:

comment_ID | comment_date | comment_parent, etc.

comment_parent остается равным 0 в комментариях верхнего уровня;он равен comment_ID комментария, на который ответили во вложенных ответах.

Исходный запрос MySQL выглядит следующим образом:

SELECT * FROM $wpdb->comments 
WHERE comment_post_ID = %d AND comment_approved = '1' 
ORDER BY comment_date ASC LIMIT %d"

Через следующий php ивыводит список комментариев, комментарии перечисляются по дате без учета вложенных ответов как таковых:

comment_ID | comment_date | comment_parent
100          Jan 01         0      (this is a top level comment)
104          Jan 03         0      (this is a top level comment)
106          Jan 04         100    (this is a reply to the first comment)
108          Jan 05         104    (this is a reply to the second comment)

Очевидно, последовательность нарушена, так как я сортирую по дате.Комментарий 106 должен появиться прямо под комментарием 100, а комментарий 108 должен быть ниже комментария 104.

Я пытаюсь не менять свой php, и я хотел бы сделать это с запросом MySQL, но не могу сделать это правильно,Я пытался использовать JOIN, GROUP BY, HAVING, как предлагалось в подобных вопросах, но безуспешно.Есть ли способ для меня, чтобы добиться правильной сортировки прямо из запроса и сохранить мой php без изменений?

Ответы [ 2 ]

4 голосов
/ 04 мая 2011

Ну, я наконец-то понял это, частично благодаря комментарию Нупула выше, который сказал, что: «Вы можете сначала получить все комментарии верхнего уровня за один раз, а затем вложенные комментарии (все) во втором раунде и заполнитьваш контент соответственно.Я действительно попробовал этот вариант безуспешно, но это побудило меня упорствовать ...

Для справки и надеюсь, что это может кому-то помочь в будущем, вот как я это исправил. Два отдельных запроса MySQL извлечение первых комментариев верхнего уровня и, во-вторых, вложенных комментариев (эти запросы отформатированы для WordPress.)

$comments = $wpdb->get_results($wpdb->prepare("
  SELECT * 
  FROM $wpdb->comments 
  WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent = '0' 
  ORDER BY comment_date ASC 
  LIMIT %d
",etc,etc)); 

$replies = $wpdb->get_results($wpdb->prepare("
  SELECT * 
  FROM $wpdb->comments 
  WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent <> '0' 
  ORDER BY comment_date ASC 
  LIMIT %d
",etc,etc));

Затем я вхожу в свой основной цикл комментариев (FOREACH), ища комментариев верхнего уровня * только 1013 *.В этом цикле внизу я вхожу во вложенный цикл IF, ища вложенные комментарии, где

$ reply-> comment_parent == $ comment-> comment_ID (сравнивая мои 2 запроса MySQL))

и, если true, корректирую $ comments так, чтобы он равнялся $ answers , чтобы мои вложенные комментарии корректно отображались в WordPress.Затем я возвращаю значение $ comments в исходное состояние и выхожу из моего вложенного цикла комментариев обратно в основной FOREACH.

Возможно, в моих рассуждениях или казни есть недостатки, но это работает как шарм!Конечно, это не предусматривает дополнительных вложенных уровней, и все вложенные комментарии пишутся один за другим, даже если они являются ответами друг другу, но для меня этого вполне достаточно!

Для демонстрации, http://www.vincentmounier.com/blog2/ и нажмите на любую из ссылок «Показать комментарии» внизу сообщений.Нупуль, еще раз спасибо за мотивацию!

3 голосов
/ 03 мая 2011

Возможно, вам лучше изменить дизайн стола.Один из лучших способов реализации вложенных комментариев - с помощью модифицированного обхода дерева предзаказов (MPTT)

Это статья о меню MPTT , но вы должны научиться реализовыватьСистема комментариев использует аналогичную схему.

...