Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка товаров всех потомков, иерархические стуктуры 
:(
    Опции темы
taral
Дата 6.12.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Здравствуйте. Хотел бы услышать как реализовать запрос наиболее лучшим способом. Поскольку в таблице 200к записей и категорий 15к
Категории хранятся в таком формате
id         name              parent_id  path
1     Категория 1            0           
2     Категория 2            0
3     Категория 2.1         2             2
4    Категория 2.1.1       3             2,3
5    Категория 2.1.1.1    4             2,3,4

Как видим parent_id это уникальный идентификатор родителя а path это строка в которой через запятую прописаны id всех родителей.
Есть еще таблица products
id         name         category_id
1         Товар 1              5
2         Товар 2              5
3         Товар 3              3
.......
У меня есть id категории Категория 2
И мне нужно выбрать все товары из подкатегорий этой категории. Как лучше реализовать запрос?
Пока у меня вышел такой результат
Код

SELECT `product`.* FROM `product` JOIN `categories` ON (`categories`.`id` = `product`.`category_id`) WHERE AND (`categories`.`path` LIKE '%,1718,%' OR `categories`.`path` LIKE '1718,%' OR `categories`.`path` LIKE '%,1718' OR `categories`.`path` = 1718)

`categories`.`path` LIKE '%,1718,%' в том случае если это средний элемент
`categories`.`path` LIKE '1718,%' в том случае если это первый элемент
`categories`.`path` LIKE '%,1718' в том случае если это последний элемент
`categories`.`path` = 1718 в том случае если это единственный элемент
Но это решение мне не нравится. Спасибо за внимание
PM MAIL   Вверх
umka
Дата 7.12.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.1.2004

Репутация: нет
Всего: 0



Имхо, несколько рекурсивных запросов с использованием индексов будут лучше, чем полный перебор с этими like-ами.
PM MAIL WWW   Вверх
ksnk
Дата 7.12.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



taral, Это Mysql? Вместо like можно использовать регулярки. так получится меньше головняка с расположением индекса категории в "пути".

Можно добавить всем "путям" по паре запятых в начале и в конце. так можно свести количество like'ов к одному.

А вообще - стоит поэкспериментировать и сравнить скорости выборки тяжелого запроса с like'ами с простым рекурсивным перебором всех категорий.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 7.12.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(taral @  6.12.2010,  14:18 Найти цитируемый пост)
И мне нужно выбрать все товары из подкатегорий

из всех подкатегорий или непосредственных "потомков"? хотя, пожалуй, непосредственных потомков можно и по parent_id выбирать.
Цитата(ksnk @  7.12.2010,  10:33 Найти цитируемый пост)
 Вместо like можно использовать регулярки

и окончательно похоронить возможность использования текстовых индексов.
Цитата(ksnk @  7.12.2010,  10:33 Найти цитируемый пост)
Можно добавить всем "путям" по паре запятых в начале и в конце. 

только в конце.
т.е. текущий элемент - id = 4, path=2,3
тогда запрос на выбор всех потомков: where path like "2,3,%"
PM MAIL   Вверх
ksnk
Дата 7.12.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(skyboy @  7.12.2010,  12:21 Найти цитируемый пост)
тогда запрос на выбор всех потомков: where path like "2,3,%" 

а если путь "...,22,3,1"?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 7.12.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



так в маске ж впереди процента нет.

Добавлено через 33 секунды
то когда родителей выбираешь, надо извращаться. с потомками проще все.
PM MAIL   Вверх
ksnk
Дата 7.12.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(skyboy @  7.12.2010,  15:32 Найти цитируемый пост)
так в маске ж впереди процента нет.

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
taral
Дата 7.12.2010, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Большое спасибо за ответы. Пока попробую добавить запятые спереди и сзади. Был бы благодарен если бы подсказали как можно изменить структуру в базе что бы этот запрос делался проще. Я сначала думал использовать метод nested sets. Но не рискнул. Категорий слишком много. И дерево хоть и редко но будет меняться. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1229 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.