Страницы с уровнем - PullRequest
0 голосов
/ 24 июня 2009

извините, если вы посчитаете этот вопрос глупым, но мне действительно нужна помощь. Вот немного информации об этом.

Структура базы данных


id | parent_id | уровень | Имя

1 | 0 | 1 | Домашняя страница

2 | 1 | 2 | Ребенок домашней страницы

3 | 1 | 2 | Еще один ребенок с домашней страницы

4 | 2 | 3 | Под дочерний элемент идентификатора страницы 2

5 | 3 | 3 | Под дочерний элемент идентификатора страницы 3


Вопрос


Как мне сделать оператор SQL, чтобы сгруппировать мои строки по уровню и сделать этот вывод.

Желаемый вывод


Домашняя страница

~~ Ребенок домашней страницы

~~~~ Под дочерний элемент идентификатора страницы 2

~~ Еще один ребенок домашней страницы

~~~~ Sub дочерний идентификатор страницы 3

Я знаю, как сделать это с помощью метода рекурсии, но я хочу знать, могу ли я сделать это с помощью одного оператора SQL.

Ответы [ 3 ]

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

Я часто рекомендую эту статью для Хранение иерархических данных в базе данных для подобных вопросов.

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

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

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

Ну, вы можете упорядочить данные по parent_id, чтобы они были правильно отсортированы:

$menu = mysql_query("SELECT * FROM menu ORDER BY parent_id, level, name");

Затем используйте уровень, чтобы определить свой отступ:

while ($row = mysql_fetch_object($menu)) {
  echo str_repeat('~~', $row->level).' '.$row->name.'<br />';
}

Допустим, вы хотите, чтобы они были во вложенных списках или в каком-либо другом элементе (вместо отступа с помощью префикса, например '~~'):

$level = 0;
echo '<ul>';
while ($row = mysql_fetch_object($menu)) {
  if ($row->level > $level) {
    echo '<ul>';
  } else if ($row->level < $level) {
    echo '</ul>';
  }
  echo '<li> '.$row->name.'</li>';
  $level = $row->level;
}
for ($i = $level; $i >= 0; $i--) {
  echo '</ul>';
}
0 голосов
/ 24 июня 2009

Это можно сделать с помощью одного запроса, который вернет результат точно так, как вы описали. На сайте mysql есть отличное руководство по иерархическим данным.

Вы можете сразу перейти к "Модель вложенного набора", но я предлагаю прочитать весь учебник.

Вот ссылка: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

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