У меня есть таблица, содержащая атрибуты со следующей структурой:
id: bigint unsigned autoincrement
product_id: bigint foreign key
attribute_id: bigint foreign key
value: varchar(100)
Я могу запросить один критерий следующим образом:
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = ? AND value = ?
Однако мне нужно найти продукты, которые соответствуют нескольким таким критериям и хотели бы избежать нескольких запросов к базе данных по соображениям производительности. Простое добавление большего количества критериев с AND не будет работать, так как они будут включать те же столбцы, например:
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = 1 AND value = 'Blue'
INTERSECT
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = 2 AND value = '36'
INTERSECT
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = 3 AND value = 'slim'
Я читал об операторе INTERSECT, который, кажется, может работать, но я читал, что MySQL не поддерживает это, поиск по MySQL 8 документации не дал релевантного результата, и запрос, который я считаю правильным, приводит к ошибке MySQL.
Я также что-то читал подобное может быть достигнуто с помощью внутреннего соединения, но все примеры, которые я нашел, включают несколько таблиц. Также может быть еще лучший или более простой способ написать запрос, который мне не приходил в голову. Или, возможно, на самом деле лучше просто отправить несколько запросов и вычислить пересечение за пределами MySQL (хотя я был бы очень удивлен). Я очень ценю любую помощь от любого, кто делал что-то подобное в прошлом.