|
|
|
| Всем привет!
Интересуюсь тем, как лучше справляться с нижеприведенной задачей
допустим есть таблица
table
id name id_parent
1 'земленные' 0
2 'кортошка' 1
3 'морковка' 1
4 'морские' 0
5 'рыбы' 4
В общем обычный каталог. Так вот какой аглоритм можно придумать по оптимальней для следующей задачи. Приходит к нам id = 3. выводятся 3,2,1,4. Приходит 5, выводятся 5,4,1
Алгоритм, думаю следующий. рекурсией с одним запросом внутри рекурсии дергаем базу, заносим в массив, и из массива затем выводим. Так вот это получиться очень много обращений к бд. А возможно ли одним запросом к mysql не зная глубины вложенности. и как это делается обычно? | |
|
|
|
|
|
|
|
для: Амбер
(01.08.2010 в 22:35)
| | Что-то я по названным id не уловил - по какому принципу то достаются записи? | |
|
|
|
|
|
|
|
для: neadekvat
(01.08.2010 в 22:43)
| | id int(11) DEFAULT NULL - это автоинкремент.
по id_parent - происходит связывание, Родитель - дети | |
|
|
|
|
|
|
|
для: Амбер
(01.08.2010 в 22:55)
| | Да что вы. А посмотрите на свой пример данных.
Приходит 5, у него родитель 4, а у 4 родителя уже нет. | |
|
|
|
|
|
|
|
для: neadekvat
(01.08.2010 в 22:57)
| | Записи достаются случайно. Сначала в меню отображаются 1 'земленные' 0 и 4 'морские' 0
. Тоесть те, у которых id_parent = 0. Затем кликается на любом из них и раскрывается список. детей. Кликается на ребенке. И ребенок становиться родителем и показывает своих детей.
Ну в общем могу на живом примере показать, сайт, где работает. Если Вам, neadekvat есть куда скинуть адрес. | |
|
|
|
|
|
|
|
для: Амбер
(01.08.2010 в 22:59)
| | Здесь, например, показано, как обойтись без рекурсии.
А как с рекурсией - да это стыдно спрашивать, примеров такого кода очень много | |
|
|
|
|
|
|
|
для: neadekvat
(01.08.2010 в 23:08)
| | так я не спрашиваю как реализовать мне рекурсию)),
я спрашиваю каким способом сейчас (в связи с появившимися на хостерах новые версии mysql) это лучше делать. Рекурсией или одним запросом. И можно ли это сделать одним запросом с учетом незнания глубины вложенности узлов
И второй вопрос, насколько это вредно за одно обновление страницы пользователем дернуть таблицу раз 50 таким к примеру запросом SELECT * FROM tab WHERE id = '$id'? | |
|
|
|
|
|
|
|
для: Амбер
(01.08.2010 в 23:14)
| | Нет, что-то я не представляю себе, как это можно сделать одним запросом.
Если бд будет возвращать мне кучу записей одного уровня вложенности, плюс у каждого еще детей и детей тех детей и далее, а я средствами php должен буду отсортировывать это все..где-то теряется принцип использования бд, а?
А 50 раз - че-т многовато. Где вы там 50 раз набрали? Одна вложенность - один запрос. Это, конечно, если по одной ветке раскрывать | |
|
|
|
|
|
|
|
для: neadekvat
(01.08.2010 в 23:18)
| | ну да, я тоже так подумал, и не смог сделать одним запросом, хотя руки чесались конечно же)) и сделал одной мега рекурсией))
50 запросов я перебрал. А вот скажем 20 запросов. Да 200 пользоватлей еже минутно к примеру (хотя представить сложно) 200*20 = 4000 запросов к базе в минуту. Сколько там соединений допустимо в mysql. Где бы про это вообще почитать? | |
|
|
|
|
|
|
|
для: Амбер
(01.08.2010 в 23:25)
| | В интернете :) И когда найдете - можете даже ссылку здесь оставить. | |
|
|
|