Рекурсия одним запросом - такое возможно?

M2
На сайте с 11.01.2011
Offline
341
709

Доброе утро!

Имеется таблица категорий. К примеру такая:


cat_id | parent_cat_id
1 0
2 1
3 1
4 2
5 2
6 1
7 1
8 4
9 4
10 0

Есть возможность как-то одним запросом выбрать все категории от 1 до 10. Т.е. те, для которых родитель 1, если есть "под"-родители, их тоже и так неограниченно много. До второй корневой категории.

------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше
IL
На сайте с 20.04.2007
Offline
435
#1

Так примерно можно.. до второго уровня..

SELECT с2.cat_id, с2.parent_cat_id FROM categories c2
LEFT join categories c1 ON c1.cat_id = c2.parent_cat_id
WHERE c1.parent_cat_id = 0 OR c2.parent_cat_id = 0

до третьего - ещё один JOIN ..

Хотя, несколько запросов + разбор на клиенте как правило быстрее

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
M2
На сайте с 11.01.2011
Offline
341
#2
ivan-lev:
Хотя, несколько запросов + разбор на клиенте как правило быстрее

А можно наводку хотя бы?...

Mishiko
На сайте с 24.01.2012
Offline
61
#3

На много проще и правильней будет это сделать на стороне клиента. Делаете SELECT * и потом разбираетесь кто кому отец:)

CrowdLinks.ru (http://crowdlinks.ru/) - крауд-маркетинг для вас. Отзывы на серче (/ru/forum/996395).
M2
На сайте с 11.01.2011
Offline
341
#4

Ну вот, наваял:


$sql = 'select * from categories';
$db->query($sql);
while ($data = $db->parse())
$cat[] = $data;

function get_tree($id, $final_array = array())
{
global $cat;
if (!preg_match('#^[0-9]+$#', $id))
return false;

echo array_search($id, $cat[0]);
}

но проблема в том, что у меня получается многомерный массив, а array_search в этом случае, видимо, не работает :(

---------- Добавлено 11.03.2013 в 15:11 ----------

Короче говоря, я понял (!!!) что не совсем понимаю постановку задачи. Попытаюсь её здесь внятно сформулировать.

К примеру у нас есть книжки. Учебная литература. Категории могут быть такими:

--Математика

---Алгебра

---Геометрия

---Тригонометрия

---Высшая математика

---Актуарная математика

--Лингвистика

---Английский язык

---Французский язык

---Китайский язык.

Так вот, к примеру у нас следующий расклад по книжкам:

В категории Английский язык - 30 книг.

В категории Французский язык - 2 книги

В категории Китайский язык - 0 книг.

Так вот, если мы заходим в английский, мы видим 30 книжек. Заходим в категорию "Французский язык" - видим 2 книжки. Но мы так же можем зайти и в категорию "Лингвистика". Теоретически мы там ничего не увидим. А должны увидеть 32 книжки, т.е. выборку из всех подкатегорий категории лингвистика.

Может быть и такое, что подкатегория содержит подподкатегории. Ну тупой пример:

--Лингвистика

---Английский язык

----Британский

----Американский

Т.е. зайдя в категорию английский язык в этом случае, мы должны увидеть выборку объектов из британского и американского языков.

Mishiko
На сайте с 24.01.2012
Offline
61
#5

http://www.codenet.ru/webmast/php/tree.php вот не самое изящное решение - но должно вам помочь.

M2
На сайте с 11.01.2011
Offline
341
#6
Mishiko:
http://www.codenet.ru/webmast/php/tree.php вот не самое изящное решение - но должно вам помочь.

Оно выводит всё. А мне нужно начиная с определённой категории. Т.е. не всё дерево базы выводить, а только часть его. К примеру в моём примере:


--Математика
---Алгебра
---Геометрия
---Тригонометрия
---Высшая математика
---Актуарная математика
--Лингвистика
---Английский язык
---Французский язык
---Китайский язык.

Зашли в математику - выдалась вся математика БЕЗ лингвистики. Зашли в лингвистику - выдалась вся лингвистика без математики. как-то так.

IL
На сайте с 20.04.2007
Offline
435
#7
mark2011:
А мне нужно начиная с определённой категории.

Ну так и передавать в функцию ID-шник нужной категории..

 ShowTree($ParentID, $lvl) { 
nezabor
На сайте с 19.07.2010
Offline
152
#8

попробуй вот у них подсмотреть

http://simplacms.ru/

там демка есть, еще если немного усилий приложить, то и обнулить ее можно

Чудес не бывает...
M2
На сайте с 11.01.2011
Offline
341
#9

Спасибо всем огромное за помощь!

Вопрос решён.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий