![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 И мне нужно выбрать все товары из подкатегорий этой категории. Как лучше реализовать запрос? Пока у меня вышел такой результат
`categories`.`path` LIKE '%,1718,%' в том случае если это средний элемент `categories`.`path` LIKE '1718,%' в том случае если это первый элемент `categories`.`path` LIKE '%,1718' в том случае если это последний элемент `categories`.`path` = 1718 в том случае если это единственный элемент Но это решение мне не нравится. Спасибо за внимание |
|||
|
||||
umka |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.1.2004 Репутация: нет Всего: 0 |
Имхо, несколько рекурсивных запросов с использованием индексов будут лучше, чем полный перебор с этими like-ами.
|
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
taral, Это Mysql? Вместо like можно использовать регулярки. так получится меньше головняка с расположением индекса категории в "пути".
Можно добавить всем "путям" по паре запятых в начале и в конце. так можно свести количество like'ов к одному. А вообще - стоит поэкспериментировать и сравнить скорости выборки тяжелого запроса с like'ами с простым рекурсивным перебором всех категорий. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
из всех подкатегорий или непосредственных "потомков"? хотя, пожалуй, непосредственных потомков можно и по parent_id выбирать. и окончательно похоронить возможность использования текстовых индексов. только в конце. т.е. текущий элемент - id = 4, path=2,3 тогда запрос на выбор всех потомков: where path like "2,3,%" |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
а если путь "...,22,3,1"? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
так в маске ж впереди процента нет.
Добавлено через 33 секунды то когда родителей выбираешь, надо извращаться. с потомками проще все. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
A! ну да. Правда для того. чтобы узнать путь - нужно прочитать собственную строчку из базы. Впрочем она, вероятнее всего, и так читается. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Большое спасибо за ответы. Пока попробую добавить запятые спереди и сзади. Был бы благодарен если бы подсказали как можно изменить структуру в базе что бы этот запрос делался проще. Я сначала думал использовать метод nested sets. Но не рискнул. Категорий слишком много. И дерево хоть и редко но будет меняться.
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |