Я унаследовал базу данных, которая имеет структуру с таблицей продуктов, таблицей, состоящей из некоторых атрибутов продукта, и другой таблицей для построения взаимосвязи между этими атрибутами и данным продуктом.
Пользователь может фильтровать товары по комбинации этих атрибутов, что означает, что если выбрано более одного атрибута, возвращаются только товары со всеми этими атрибутами. К сожалению, в настоящее время существует исключение из этого правила, согласно которому пользователь, выбирающий один из двух определенных атрибутов, нуждается в результатах, содержащих либо (либо оба).
Запрос в настоящее время выглядит так (не мой код):
SELECT DISTINCT p.* FROM products AS p
INNER JOIN attributes a ON p.product_id=a.property_id
WHERE a.attribute_id IN (1,3,7)
GROUP BY p.property_id
HAVING COUNT(DISTINCT a.attribute_id) = 3
Я сомневаюсь, что вышеизложенное является особенно эффективным способом получения требуемых продуктов, но я не уверен, как действовать в свете нового требования.
Я создал код php для создания специального запроса, когда выбраны два «специальных» атрибута (3 и 7):
SELECT DISTINCT p.* FROM products AS p
INNER JOIN attributes a ON p.product_id=a.property_id
WHERE a.attribute_id IN (1,3) OR a.attribute_id IN (1,7)
GROUP BY p.property_id
HAVING COUNT(DISTINCT a.attribute_id) = 2
Однако это по-прежнему не работает должным образом - любые продукты, которые имеют оба этих атрибута, не возвращаются в результате (это, очевидно, связано с предложением HAVING COUNT, но я не знаю, как мне это исправить. Для ясности, проблема в том, что если у 10 товаров есть только атрибут 3, а у еще пяти есть атрибуты 3 и 7, приведенный выше запрос вернет только 10 записей.
Возможно ли использовать какой-то подзапрос или какие есть альтернативы?