[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Объясните что это за запрос
prodigy
То ли лыжи не едут то ли я не понимаю как работает этот запрос:

$sql = 'SELECT node.*, (COUNT(parent.id) - 1) AS "depth"
FROM tree AS node , tree AS parent
WHERE node.left_key BETWEEN parent.left_key AND parent.right_key
GROUP BY node.id
ORDER BY node.left_key';


и еще вопрос - подскажите хороший рабочий класс без *овнокода для nested sets :)
спасибо!



Спустя 3 минуты, 19 секунд (20.03.2012 - 12:02) Visman написал(а):
Кто его знает, что это за запрос biggrin.gif
Но видать дерево у тебя там в таблице хранится, вот он все узлы собирает и к ним приписывает кол-во родителей.

Спустя 3 минуты, 8 секунд (20.03.2012 - 12:05) prodigy написал(а):
как он работает-то?
я не разу не видел чтоб вытягивалась одна и таже таблица и над ней что-то считалось
как он узнает кол-во родителей?

Спустя 3 минуты, 6 секунд (20.03.2012 - 12:08) Visman написал(а):
Вот условие
node.left_key BETWEEN parent.left_key AND parent.right_key

по которому он сам себя сопостовляет

Спустя 4 минуты, 22 секунды (20.03.2012 - 12:12) prodigy написал(а):
а можете по человечески?
каждая строка сравнивает себя со всеми строками таблицы справа?
но у меня не получается((
к примеру если у строки левый ключ 10 а правый 23 то

10 BETWEEN 10 AND 23

найдет 6 записей

а на самом деле это узел второго уровня huh.gif

объясните как оно сравнивается то сверху - снизу? сбоку?

Спустя 10 минут, 34 секунды (20.03.2012 - 12:23) Visman написал(а):
Если значение поля left_key лежит между значениями полей left_key и right_key включительно, то оно засчитывается в это вычисление (COUNT(parent.id) - 1)

Спустя 12 минут, 50 секунд (20.03.2012 - 12:36) prodigy написал(а):
blink.gif
между left_key = 10 right_key = 23
лежат вот такие значения:
11 - 12; 13 - 20; 21 - 22; 14 - 15; 16 - 17; 18 - 19
но база данных находит только 2 - 1 = 1 huh.gif

Спустя 16 минут, 23 секунды (20.03.2012 - 12:52) Visman написал(а):
Я написал, что вижу в запросе. Как у тебя данные хранятся в таблице и как они должны соотвествовать друг другу тебе виднее.
Если получаешь не то что надо, значит запрос не верен.

Спустя 2 минуты, 33 секунды (20.03.2012 - 12:55) prodigy написал(а):
Visman, спасибо тебе

я про эту тему - http://www.getinfo.ru/article610.html

Получается что сравнение работает, где ID левой таблицы <= ID правой таблицы

Спустя 4 минуты, 40 секунд (20.03.2012 - 12:59) Placido написал(а):
Этот запрос определяет соответствующий уровень (или глубину - "depth") для всех узлов дерева по их правому и левому ключу. Да, и запрос рабочий.

Спустя 1 час, 54 минуты (20.03.2012 - 14:53) Michael написал(а):
Цитата (prodigy @ 20.03.2012 - 11:36)
:blink:
между left_key = 10 right_key = 23
лежат вот такие значения:
11 - 12; 13 - 20; 21 - 22; 14 - 15; 16 - 17; 18 - 19
но база данных находит только 2 - 1 = 1  :huh:

left_key ПЕРВОЙ таблицы сравнивается с left_key и right_key ВТОРОЙ таблицы.
Такому условию во второй таблице соответствуют только предки эл-та из первой таблицы.
Промежуточный результат типа такой:


id_эл_та id_предка
1 предок1_3
1 предок1_2
1 предок1_1
1 предок1_0
2 предок2_1
2 предок2_0
...

По первому полю идет группировка и поэтому получаем элемент и его глубину.

Спустя 7 минут, 12 секунд (20.03.2012 - 15:00) prodigy написал(а):
Цитата
только предки

а я полночи не мог понять и думал что правая таблица выбирается полностью smile.gif
спасибо всем!!!
С запросом вроде все ясно, просто я раньше такого не видел.

Кстати у кого-то есть рабочий хороший класс с nested sets(без *овнокода)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.