Мне кажется, что этот вопрос, вероятно, задавался уже тысячу раз, поэтому я прошу прощения, если на него был дан ответ. И если так, может кто-то указать мне на правильные сообщения / ссылки?
Я пытаюсь создать многогранную навигацию для моего сайта. Он использует MySQL и вот примерный набросок таблиц, которые я использую:
products:
- id
- title
- description
attributes:
- product_id
- name
- value
categories:
- id
- name
products_to_categories:
- product_id
- category_id
То, что я хочу сделать, это отобразить список доступных атрибутов, когда вы находитесь в категории, позволяя вам выбрать одно или несколько значений для каждого из этих атрибутов. Чтобы дать вам пример, посмотрите на эту страницу из Office Depot: http://www.officedepot.com/a/browse/binders/N=5+2177/
До сих пор я использовал много объединений для фильтрации по нескольким атрибутам:
SELECT products.*, a_options.*
FROM products_to_categories AS pc, products,
attributes AS a_options, /* list of attribute/value pairs I can continue to refine on */
attributes AS a_select1 /* first selected attribute */
attributes AS a_select2 /* second selected attribute */
...
WHERE pc.category_id = 1
AND products.id = pc.product_id
AND a_options.product_id = products.id
AND a_options.name != 'Color' AND a_options.name != 'Size'
AND a_select1.product_id = products.id
AND a_select1.name = 'Color' AND (a_select1.value = 'Blue' OR a_select1.value = 'Black')
AND a_select2.product_id = products.id
AND a_select2.name = 'Size' AND a_select2.value = '8.5 x 11'
В основном a_options
вернет все атрибуты для тех продуктов, которые являются подмножеством фильтров, которые я применил, используя a_select1
и a_select2
. Поэтому, если я использую пример Binders из Office Depot, я хочу показать все доступные атрибуты после выбора синего или черного цвета для цвета и «8,5 x 11» для размера.
Затем я использую код PHP, чтобы удалить дубликаты и расположить полученные атрибуты в массив, например:
attributes[name1] = (val1, val2, val3, ...)
attributes[name2] = (val1, val2, val3, ...)
Есть ли способ ускорить мой запрос или написать его более эффективно? У меня есть настройки индексов по имени и значению в таблице атрибутов (а также по всем идентификационным номерам). Но если кто-то выберет пару атрибутов, запрос будет выполняться медленно.
Заранее спасибо за помощь,
Шридхар