Задавайте вопросы, мы ответим
Вы не зашли.
Хотелось бы извлечь 3 уровня дерева хранящегося в таблице одним запросом в формате (данные n уровня, данные n+1 уровня, данные n+2 уровня в одной строке, т.е. 3 записи в строке), или хотя бы просто по одной записи в строчке.
Структура таблицы:
id:int;
p_id:int (id родителя);
name: varchar;
LEFT JOIN вроде как не подходит, поскольку может быть например только два уровня, соответственно в 3 уровне будет null и ничего не вернется. Если объединять через UNION ALL чтобы в одной строке был только один уровень, то выходит несколько одинаковых запросов. Т.е. сначала делаем SELECT по первому уровню, потом UNION ALL и SELECT второго уровня, а условие для p_id- снова перебор первого уровня... В общем совсем запутался
Неактивен
Мне кажется, что для такой структуры таблицы можно сортировать только по корневая (пид=0 или =нул) или дочерняя запись.
А разворачивать в древовидную структуру уже в приложении.
Неактивен
Ок, но тогда все равно хотелось бы получить список всех нодов одним запросом. У меня пока один вариант для этого не оптимальный-
(SELECT * FROM tree WHERE p_id=%n)
UNION
(SELECT * FROM tree WHERE p_id in (SELECT `id` FROM tree WHERE p_id=%n) )
А третий уровень соотв. еще больше вложенных запросов.
Отредактированно Mikel (08.07.2011 08:49:47)
Неактивен
можно попробовать так:
$res = mysql_query("SELECT * FROM tree");
$data = array();
if (mysql_num_rows($res) > 0)
{
while ($row = mysql_fetch_assoc($res))
{
$data[$row['parent_id']][] = $row;
}
}
теперь у нас есть массив со всеми категориями и подкатегориями.
далее рекурсией выводим любое количество уровней и подуровней.
пример для первого уровня.
foreach ($data[0] as $item)
{
echo $item['name'];
}
вместо нуля подставляем нужный id категории и выводим ее подкатегории.
так будет намного быстрее, чем большое кол-во запросов. (надеюсь что категорий не миллион)
З.Ы. У меня первый уровень (parent_id) всегда равен нулю. Если у вас NULL то тогда можно использовать null.
Неактивен
Возможно Вы правы. Если в дереве будет записей порядка сотни, обрабатывать потом уже в php. Пока остановлюсь на этом варианте. Спасибо!
Неактивен
Если я правельно понял то вам нужно это:
Неактивен
evgeny написал:
Если я правельно понял то вам нужно это:
SELECT
id 'id_level_1',
pid 'id_level_2',
(SELECT pid FROM trees WHERE id=a.pid) AS 'id_level_3'
FROM trees a
Не совсем то. Это только два уровня и надо вытаскивать еще другие данные узла помимо его идента, а в этой структуре можно добавить в результат только один столбец из внутреннего селекта.
Неактивен
Не совсем то. Это только два уровня
Вот 3, аналогично можно сделать и 4 и 5 и 6.
надо вытаскивать еще другие данные узла помимо его идента
Неактивен