
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
28.03.2014, 22:33:46
|
|||
|---|---|---|---|
|
|||
Система фильтров |
|||
|
#18+
Добрый день уважаемые форумчане, передо мной встала задача сделать систему фильтров для интернет-магазина. Имеется несколько подручных таблиц: product, category, filter, filter_value, product_filter_value. Соответственно Таблица product хранит записи о товарах; Таблица category хранит записи о категориях товаров; Таблица filter хранит записи о фильтрах, фильтры связаны с категориями товаров внешним ключом, здесь храниться общая информация о фильтре: название, тип, настройки отображения на сайте и т.п.; Таблица filter_value хранит доступные значения фильтров, например, цвета, размеры, марки производителей, а также, числовые значения фильтров, например, массу, мощность, объём и т.д., значения фильтров связаны с самими фильтрами внешним ключом; Таблица product_filter_value связывает товары со значениями фильтров. Теперь запрос для выбора, например карт памяти объёмом 4 или 8 Гб выглядит так: Код: sql 1. 2. 3. 4. 5. Здесь 1 - id фильтра "Объём карты памяти", а 3 и 4 - id записей из таблицы filter_value и им соответствуют значения 4 и 8 Гб А запрос для выбора карт памяти от производителя Kingston так: Код: sql 1. 2. 3. 4. 5. Здесь 2 - id фильтра "Производитель карты памяти", а 25 - id записи из таблицы filter_value и ей соответствует значение Kingston. А как сделать запрос для выбора карт памяти объёмом 4 или 8 Гб от производителя Kingston? Если объеденить оба условия, то в результате получается 0 пересечений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.03.2014, 23:59:43
|
|||
|---|---|---|---|
|
|||
Система фильтров |
|||
|
#18+
fv.filterId IN (1,2) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.03.2014, 13:34:28
|
|||
|---|---|---|---|
|
|||
Система фильтров |
|||
|
#18+
SharuPoNemnogufv.filterId IN (1,2) ? Тогда получается условие должно выглядеть так? Код: sql 1. По идее это пройдёт, и даже можно уброть fv.filter IN ... потому что pfv.filterValueId и так связан внешним ключом с filter, а как быть если нужно ещё и условие: Код: sql 1. Здесь filterId - id числового фильтра, скажем мощности пароварки, а 1200 и 1800 сами значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.03.2014, 14:53:31
|
|||
|---|---|---|---|
|
|||
Система фильтров |
|||
|
#18+
Код: sql 1. Составляйте условия динамически и связывайте их через OR. потом в запрос. Я так понимаю php используется же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.03.2014, 16:29:13
|
|||
|---|---|---|---|
|
|||
Система фильтров |
|||
|
#18+
SharuPoNemnogu Код: sql 1. Составляйте условия динамически и связывайте их через OR. потом в запрос. Я так понимаю php используется же. Да, использую PHP, только в таком варианте выберутся как пароварки с мощностью от 1200 и до 1800, так и пароварки конкретного производителя, потому что условия объеденены оператором ИЛИ, а нужно выбрать пароварки определённой мощности + определённого производителя. Пока решил очень жестоко: для каждого фильтра выбираю GROUP_CONCAT(p.id SEPARATOR ",") as ids и на стороне сервера делаю array_intersect с предыдущим массивом id-шников товаров. После выполнения данной операции для всех фильтров получаю перечень id товаров подходящих под все фильтры. Можно ещё наверное упростить задачу если в каждом последующем запросе указывать критерий IN по полю id товара, передавая как список id товаров которые уже подходят под фильтры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&mobile=1&tid=1835056]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
61ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 338ms |

| 0 / 0 |
