Поиск вложенных множеств MySQL - PullRequest
0 голосов
/ 14 июня 2011

Я действительно борюсь с запросом вложенного набора в нашем магазине, управляемом PHP / MySQL, я буду использовать электронные компоненты в качестве примера.

Категории хранятся в виде модели вложенного набора (слева, справа иглубина).

Когда покупатель перемещается по магазину, он может фильтровать список товаров по марке, категории, ценовому диапазону и т. д.

Допустим, покупатель просматривает все товары Sony,У Sony будут продукты в области вычислительной техники, телевизоров, аудио и бытовой техники.

Но продукты Sony хранятся не в этих категориях (но они могут быть), они хранятся в подкатегориях этих основных категорий, таких как:

Televisions > LCD > Widescreen
Televisions > CRT
Computing > Optical Drives > DVD-RW
Computing > Input Devices > Wireless > Keyboards
Audio > Portable > MP3
Household Appliances

После того, как клиент выбрал Sony, я хочу, чтобы у него была возможность сузиться по категориям, чтобы у него изначально были следующие варианты:

Televisions
Computing
Audio
Household Appliances

Но я могутолько сделать запрос, который возвращает список определенных категорий:

Widescreen
CRT
DVD-RW
Keyboards
MP3
Household Appliances

Мне нужно показать основные категории, тогда, если клиент выберет Телевидение, он получит выбор:

LCD
CRT

Может ли кто-нибудь помочь мне с этим, желательно, чтобы информация возвращалась как можно быстрее, с минимальной рекурсией (следовательно, с использованием вложенных множеств в первую очередь) или слишком большим количеством запросов, я был бы очень признателен.

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

select      c.categories_id, cd.categories_name, c.parent_id, c.lft, c.rgt, c.dpth
from        categories c
inner join  categories_description cd on cd.categories_id = c.categories_id
inner join  products_to_categories p2c on p2c.categories_id = c.categories_id
inner join  products p on p.products_id = p2c.products_id
where       cd.language_id='1'
and         c.lft between 3489 and 3670
and         c.categories_status = '1'
group by    c.categories_id
order by    sort_order, cd.categories_name

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

Спасибо.

1 Ответ

0 голосов
/ 03 августа 2011

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

Как вы узнали, модель nested set превосходна для быстрого и эффективного извлечения узлов и листьев. Однако gotchya заключается в том, что вы обнаружили, что трудно упорядочить список после вставки.

В прошлом я преодолевал это, либо а) упорядочивая на стороне клиента (сложно), а затем кэшируя, либо б) проверяя, вставляю ли я узел / лист, чтобы он автоматически упорядочивался (или даже использовал ссылки вверх / вниз, чтобы администратор может заказать себя ПОСЛЕ вставки.

Мне лично нравится вариант 2, и я никогда не считал его проблемой.

...