Запрос для выборки комментариев

Пишу маленький сайт. К статьям на сайте хочу прикрепить комментарии. Хочу сделать их многоуровневыми как на Хабре.
Минимальная структура таблицы такова:
— comment_id — ид комментария
— parent_comment — родительский комментарий
— comment_text — сам коммент

как сделать запрос который будет выбирать комментарий по ид и все его дочерние комментарии?
  • Вопрос задан
  • 3085 просмотров
Пригласить эксперта
Ответы на вопрос 7
Melkij
@Melkij
PostgreSQL DBA
Тут уже дважды назвали nested sets — но он имеет большие накладные расходы на изменение данных. Хотя, 10к комментариев — редкость вроде, так что шевелиться должен весьма шустро.
habrahabr.ru/post/46659/

Для комментариев, даже для mysql (с постресом куда веселее с его рекурсивными запросами) — лучше, имхо, подойдёт именно Adjacency List (т.е. именно та структура, что вы и прикинули). Но строить дерево придётся уже в логике приложения — выбираете всю таблицу и строите массив[ parent_id ][] = узел. При выводе уходите в рекурсию.
Ответ написан
BuriK666
@BuriK666
Компьютерный псих
Добавьте еще topic_id и делайте выборку по нему.
Ответ написан
Комментировать
@Hint
Ищите по «Nested Sets». На хабре, в том числе, довольно много статей.
goo.gl/UnA1h
Ответ написан
Комментировать
почитайте про nested sets — это техника позволяющая хранить древовидные структуры в БД так, что большинство выборок делаются в один SQL запрос. en.wikipedia.org/wiki/Nested_set_model
Если кратко — то там к каждой записи добавляются еще два поля, которые потом и используют для выборок. Упрощается выборка но усложняется вставка.
Если сайт маленький и с nested sets разбираться не хочется (хотя весьма полезно, да и готовых реализаций полно), то можно сделать как угодно — начиная от рекурсивной выборки несколькими SQL запросами и до костыля с добавлением еще одного поля типа строка, в который прописывать «путь» к этому элементу в дереве (например айдишники узлов разделенные символом «0>12>45>») а потом делать выборку по этому полю используюя LIKE
Ответ написан
Комментировать
@egorinsk
Не слушайте этих болтунов. Для комментариев идеальный вариант — Materialized Path (уважаемые коллеги, кто предлагает Nested Sets, вы пробовали прикинуть, сколько обновлений придется сделать при вставке комментария перед 100 существующими? а перед 200?). Проблема дорогой вставки частично обходится переходом на дробные left и right key, но это сложно.

Недостатки Materialized Path: ораниченная глубина комментариев (но можно поставить например 16 или 32 — это почти всегда хватит), ограничение на число дочерних комментариев (опять же, ставим цифру типа 65536 и не паримся — вряд ли на вашем сайте будет столько ответов).

Смена родителя комментария — дорогая и сложная операция, но я не знаю, где это требуется.

Плюсы: дешевая вставка (1 обычный INSERT), дешевая выборка (1 SELECT с индексом).

Вывод: слушайте лучше мои умные советы а не этих болтунов.
Ответ написан
colonel
@colonel
Разработчик PHP, Laravel
На вопрос уже ответили, а я хочу добавить, что можно и не реализовывать ничего.
Можно взять готовое и использовать, например: disqus.com/
Пример использования:
slyweb.ru/jquerydoc/position.php
Ответ написан
Комментировать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы