Мне нужно отфильтровать продукты, в которых определенные атрибуты хранятся в объединенной таблице, которая соответствует всем требуемым свойствам, то есть пользователи должны иметь возможность постепенно сузить свой поиск, добавив требования.
Проблема действительно касается таблицы свойств, я думаю, а не объединения, учитывая следующую (упрощенную) таблицу свойств продукта:
id product_id property value
---------------------------------
1 1 color red
2 1 size small
3 2 color red
4 2 size large
как мне получить все product_ids, где значение имеет значение 'red' и 'small'?
Подобный вопрос был задан ранее, но не был дан очень полный ответ. Решение включает в себя COUNT и HAVING, чтобы получить строки, где в каждой группе столько строк, сколько требуется, например,
SELECT product_id, count(*) AS group_count FROM properties where
value = 'red' OR value = 'small'
GROUP BY product_id
HAVING group_count = 2
Это работает, но я беспокоюсь о производительности, кажется, что был бы лучший способ.
В конце концов к этому нужно будет присоединиться или хотя бы использовать его для фильтрации таблицы продуктов:
id name
-------------
1 Product 1
2 Product 2
Я забыл упомянуть, что у меня есть две из этих таблиц свойств, связанных с продуктами, по которым мне нужно фильтровать, одна с обычными атрибутами продукта, другая с доступными настраиваемыми параметрами (немного похоже на варианты).
Сценарий состоит в том, чтобы позволить пользователям фильтровать такие продукты, как:
«показать продукты, где пол =« мужской », бренд =« nike »и размер ==« маленький »», где пол и бренд - это «свойства», а размер - в настройках (настраивается при добавлении в корзину)
Решение об использовании группы с числом работает до сих пор с двумя объединенными таблицами, но оно становится грязным, требуемое количество групп - это число обязательных параметров в первой таблице, умноженное на число во второй.
Я мог бы просто получить идентификаторы из свойств (и другой таблицы), а затем просто сделать выбор, где id IN (идентификаторы), соответствующие набору идентификаторов для обеих таблиц свойств, мне не нравится идея сделать это с хотя действительно длинный список идентификаторов.