Автор Тема: Обсуждение статьи ДЕРЕВО КАТАЛОГОВ NESTED SETS (ВЛОЖЕННЫЕ МНОЖЕСТВА) И УПРАВЛЕНИЕ ИМ  (Прочитано 44433 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
To all

По просьбам читателей, продолжение темы:

http://www.webscript.ru/stories/05/01/24/6319028

Правда практическое применение в Perl, но я заметил классы PHP не сильно отличаются... ;)

Sherman

  • Гость
господа, а кто-нибудь решил проблему сортировки по названию категории при выводе полного дерева.

есть вариант, сортировать уже после выборки, но это жутко неудобно.

есть вариант, сразу находить правильное место вставки, но как реализовать - проблема...

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Sherman

Если только вывод дерева производить через рекурсию...

Хотя, честно говоря, мне еще не попадалось выводить полностью все дерево с особой соритровкой, подчиненные узлы - да...

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Phoinix, спасибо за великолепный модуль. Конечно пришлось дорабатывать его под свои нужды напильником. Но это скорее проблема не в модуле, а в том, что у меня руки кривые:) Вообщем респект.
ЗЫ. Уже выложил на спан?
ЗЫЗЫ. Сугубо моё ИМХО, но стоило бы хранить парент_ид. Впрочем, кому надо, тот добавит. У меня это заняло один вечер (чтение модуля, разбор запросов и добавление parent_id).
Ну к чему все это, лучше бы водки выпили...

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
glebushka
Цитировать
Уже выложил на спан?


Еще нет, никак раздел POD не соберу... :(

Насчет parent_id - можно, конечно добавить надо подумать...
Там еще много разных мелочей, надо будет обновить. Например, при той же выборке родительской ветки или подчиненных узлов - текущий узел не выбирается, а он часто нужен...

Оффлайн webxtor

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
У меня такая проблема.. Нужно одним запросом взять все категории первого уровня и максимум 3 второго, при учете, что я не знаю сколько всего первого

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
webxtor

[off]и фига себе изврат[/off]

А надо ли?
Только 2 запросами...

Оффлайн webxtor

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://

Оффлайн webxtor

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
А как 2мя?

А еще вот. Нужно посчитать сколько всего компаний в родительских категориях и их детях,при этом выводя только первый уровень.

Придумал вот:

SELECT count( comps.id ) , cats1.name
FROM companies AS comps, categories AS cats, categories
as cats1
where cats.id = comps.category_id
and cats.right_key <= cats1.right_key
and cats.left_key >= cats1.left_key
and cats1.level = 1
GROUP BY cats1.name

Работает, но думает треть секунды.. может можно как-то обойтись 2мя таблицами?

Оффлайн webxtor

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Цитировать
Phoinix:
ни фига себе изврат


К стати, почему изврат? Я ничего не делаю в своей работы ради исследований или интереса. Во всем, что я делаю, есть практическая необходимость.

Очень часто на сайтах необходимо отобразить все главные категории и несколько дочерних (потом обычно идет троеточие).

Вот я и хочу сделать все как можно меньшим количеством запросов.

Привожу пример:

http://www.alibaba.com/companies/0/company.html

Оффлайн Arikon

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
Помогите решить задачку. Вот исходные данные

1.


2.


По условию известны узлы, выделенные оранжевым. Нужно выбрать все узлы, выделенные зеленым.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru

Оффлайн Arikon

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
Решение было найдено благодаря ru_mysql коммунити в livejournal

SELECT DISTINCT
j2.*
FROM tree AS t1
LEFT JOIN tree AS tr ON tr.id = $root_node_id
LEFT JOIN tree AS j1 ON (j1.l <= t1.l AND j1.r >= t1.r)
LEFT JOIN tree AS j2 ON (j2.l >= j1.l AND j2.r <= j1.r AND j2.level IN (j1.level, j1.level + 1))
WHERE t1.id = $current_node_id AND j1.l >= tr.l AND j1.r <= tr.r AND j2.level >= tr.level
ORDER BY j2.l ASC

$root_node_id - Id корня
$current_node_id - Id выделенного узла
id - идентификатор узла
l - left key
r - right key
level - уровень

Запрос выбирает все "приоткрытое" дерево, начиная от указанного корня. Полезен для строительства "приоткрытого" меню любого уровня вложенности.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28