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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: построение "хлебных крошек" одним запросом
даст ссылку только на родительский раздел
а хотелось бы всю ветвь до корня и одним запросом.
OrmaJever
Отправлено: 16 Декабря, 2011 - 14:06:30
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
рекурсия
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
tuareg
Отправлено: 16 Декабря, 2011 - 14:09:56
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Если у Вас неограниченное количество вложений, то в данном варианте никак.
Если знаете сколько вложений то нужно связать столько таблиц сколько вложений.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Самое простое в такой ситуации - хранить отдельно полный путь (в упорядоченном виде) для каждого элемента в отдельном поле. Имеет свои минусы - при изменении структуры нужно перестраивать.
Иным решением станет хранение дополнительно позиции. Здесь пример:
Столько раз, сколько достаточно, чтоб покрыть максимально предполагаемую вложенность. Ну и проверку, дотянулись ли до корня и, если не дотянулись, то в этом редком случае второй запрос.
DlTA
Отправлено: 16 Декабря, 2011 - 19:13:15
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
tuareg пишет:
По факту там только один запрос. Но надо знать сколько вложений
чтоб знать количество, его надо откуда то получить даже если это число хранить в той же таблице, это уже как минимум запрос,
зная количество конечно можно сгенерить многоуровневый селект, но интересовал более изящный вариант.
Champion
Отправлено: 16 Декабря, 2011 - 19:24:07
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
DlTA пишет:
чтоб знать количество, его надо откуда то получить
Можно получить слефтжойнить 50 раз - этого точно достаточно.
Мускуль сам поймет, что пора кончать джойнить, когда очередной join ничего не вернет.
DlTA пишет:
интересовал более изящный вариант.
EuGen пишет:
полный путь (в упорядоченном виде) для каждого элемента в отдельном поле.
DlTA
Отправлено: 16 Декабря, 2011 - 19:49:35
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
Champion пишет:
SELECT t1.id, t2.id, t3.id, ....
FROM tbl t1
LEFT JOIN tbl t2 ON t2.id = t1.parent_id
LEFT JOIN tbl t3 ON t3.id = t2.parent_id
а это не сильно дофига длинная строка получается?
даже при 50 джоинах получится как минимум 100 ячеек на выходе (ид и название как минимум, и то фигня что почти все null-ом заполнены)
Champion
Отправлено: 16 Декабря, 2011 - 19:55:22
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
А что такого в том, что она длинная?)
Если набирать лень, то это можно сделать циклом. Если есть опасения, что мускуль такую длинную строку не съест, то нужно попробовать. Должен съесть. (Добавление)
DlTA пишет:
и то фигня что почти все null-ом заполнены
Это разве делает какую-то проблему?
tuareg
Отправлено: 16 Декабря, 2011 - 20:34:46
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
На Хабре по-моему чел сделал процедуру рекурсивную.
Я просто не могу понять в чем у Вас проблема, ну допустим будет запрос не один, ну и? его нельзя закэшировать? Если 2 запроса сделайте процедуру+ КЭШ
EuGen
Отправлено: 16 Декабря, 2011 - 20:38:33
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
И в чем разница? Рекурсивная процедура ничуть не лучше рекурсии на php.
50 JOIN - плохо, если данных действительно много. Изящества здесь уж точно нет.
То, что я предлагал с полным путем - вряд ли изящно тоже, так как в случае перемещения узла где-нибудь в середине пути будет очень много запросов на поиск и обновление (по сути обновить нужно будет все нижележащие поддеревья).
Изящно можно везде почти, кроме MySQL
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
tuareg
Отправлено: 17 Декабря, 2011 - 00:29:03
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Да не ну это глупо, зачем??? MySql не для этого
DlTA
Отправлено: 17 Декабря, 2011 - 01:07:24
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.