Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вытащить всех потомков из Adjacency List (Mysql)
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Вытащить всех потомков из Adjacency List (Mysql)

Страниц (1): [1]
 

1. shum0531 - 31 Августа, 2015 - 11:54:51 - перейти к сообщению
Таблица:
CODE (SQL):
скопировать код в буфер обмена
  1. DROP TABLE IF EXISTS `my_menu`;
  2. CREATE TABLE IF NOT EXISTS `my_menu` (
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,
  4.   `url` varchar(255) NOT NULL,
  5.   `linck_name` varchar(255) NOT NULL,
  6.   `parent_id` int(11) NOT NULL DEFAULT '0',
  7.   `sort` int(11) NOT NULL DEFAULT '0',
  8.   PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

Для sqlite использовалась рекурсия:
CODE (SQL):
скопировать код в буфер обмена
  1. WITH RECURSIVE tree_recursive (id, url, linck_name, parent_id, sort)
  2. AS (
  3.     SELECT id, '/' || url, linck_name, parent_id, sort
  4.     FROM my_menu
  5.     WHERE parent_id = [id]
  6.  UNION
  7.     SELECT my_menu.id, tree_recursive.url || '/' || my_menu.url, my_menu.linck_name, tree_recursive.id, my_menu.sort
  8.     FROM my_menu, tree_recursive
  9.     WHERE my_menu.parent_id = tree_recursive.id
  10. )
  11. SELECT tree_recursive.*
  12. FROM tree_recursive
  13. ORDER BY tree_recursive.sort

Но вот как быть с MySql?
2. Мелкий - 31 Августа, 2015 - 12:12:07 - перейти к сообщению
Никак. Вытягивать данные на приложение и строить там.
Можно мигрировать на другую схему хранения дерева, более заточенную на чтение потомков определённого родителя.

PS: ёпт, даже sqlite умеет рекурсивный CTE? Ох уж этот mysql.
3. shum0531 - 31 Августа, 2015 - 12:20:59 - перейти к сообщению
Мелкий пишет:
PS: ёпт, даже sqlite умеет рекурсивный CTE? Ох уж этот mysql.

Да ваще. я второй день гуглю, изучаю процедуры. Вроде как ими можно, ток вот пока не соображу как Огорчение
4. DeepVarvar - 31 Августа, 2015 - 15:49:00 - перейти к сообщению
Я вот, клепал, было дело: http://forum.php.su/topic.php?fo...35&topic=820
5. shum0531 - 31 Августа, 2015 - 16:29:50 - перейти к сообщению
DeepVarvar пишет:
Я вот, клепал, было дело: http://forum.php.su/topic.php?fo...35&topic=820

Спасибо, но это не совсем то. Мне нужен цикл вниз по дереву, а не к корню. И соответственно вложенность дерева неизвестно.
6. DeepVarvar - 31 Августа, 2015 - 16:34:32 - перейти к сообщению
Я скинул для примера синтаксиса.
7. shum0531 - 31 Августа, 2015 - 18:31:10 - перейти к сообщению
DeepVarvar, подскажите пожалуйста. Если в процедуре код возвращает более чем одну строку(результат), как их обработать?

Я полагаю в запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, parent_id INTO buff_id, buff_parent_id FROM routing WHERE parent_id = current_id;
надо добавить LIMIT 1 и условие id NOT IN () с id ранее выбранными результатами.
Вот ток не представляю как это сделать.
8. DeepVarvar - 31 Августа, 2015 - 18:38:30 - перейти к сообщению
В пдо и майскули есть closeCursor() и/или что-то еще, я уже забыл, для фетча множественных выборок.
Т.е. например ты можешь делать два селекта за один раз, и, сперва проветчить первую выборку, а потом мотнуть курсор на вторую и профетчить её.
А тут, процедура сама возвращает два сета для фетча, где в первом возвращается результат, а во втором статус как отработала эта процедура.
Ну и если ты не профетчишь все сеты, то они останутся в очереди и вывалится ошибка.
Поэтому надо либо фетчить либо делать closeCursor() чтобы эту очередь очистить.
А вообще -- обертки для работы с БД должны все это уметь под капотом, если ты конечно не на коленке пишешь.

 

Powered by ExBB FM 1.0 RC1