| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > Выборка товаров всех потомков |
| Автор: taral 6.12.2010, 15:18 | ||
| Здравствуйте. Хотел бы услышать как реализовать запрос наиболее лучшим способом. Поскольку в таблице 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 7.12.2010, 10:51 |
| Имхо, несколько рекурсивных запросов с использованием индексов будут лучше, чем полный перебор с этими like-ами. |
| Автор: ksnk 7.12.2010, 11:33 |
| taral, Это Mysql? Вместо like можно использовать регулярки. так получится меньше головняка с расположением индекса категории в "пути". Можно добавить всем "путям" по паре запятых в начале и в конце. так можно свести количество like'ов к одному. А вообще - стоит поэкспериментировать и сравнить скорости выборки тяжелого запроса с like'ами с простым рекурсивным перебором всех категорий. |
| Автор: skyboy 7.12.2010, 12:21 |
из всех подкатегорий или непосредственных "потомков"? хотя, пожалуй, непосредственных потомков можно и по parent_id выбирать. и окончательно похоронить возможность использования текстовых индексов. только в конце. т.е. текущий элемент - id = 4, path=2,3 тогда запрос на выбор всех потомков: where path like "2,3,%" |
| Автор: ksnk 7.12.2010, 15:24 |
а если путь "...,22,3,1"? |
| Автор: skyboy 7.12.2010, 15:32 |
| так в маске ж впереди процента нет. Добавлено через 33 секунды то когда родителей выбираешь, надо извращаться. с потомками проще все. |
| Автор: ksnk 7.12.2010, 16:31 |
A! ну да. Правда для того. чтобы узнать путь - нужно прочитать собственную строчку из базы. Впрочем она, вероятнее всего, и так читается. |
| Автор: taral 7.12.2010, 21:08 |
| Большое спасибо за ответы. Пока попробую добавить запятые спереди и сзади. Был бы благодарен если бы подсказали как можно изменить структуру в базе что бы этот запрос делался проще. Я сначала думал использовать метод nested sets. Но не рискнул. Категорий слишком много. И дерево хоть и редко но будет меняться. |