У вас должна быть таблица product
(в вашем случае, вероятно, oc_product
).Используйте его, чтобы избежать нескольких проверок.Также может быть продукт, который не имеет атрибутов.И вы пропустите этот продукт в результате, если будете использовать только таблицу атрибутов.
Существует два распространенных способа достижения вашей цели.Один использует LEFT JOIN:
select p.*
from oc_product p
left join oc_product_attribute a
on a.product_id = p.product_id
and a.attribute_id = 17
where a.product_id is null
Важно, чтобы условие a.attribute_id = 17
было в условии ON.Если вы используете его в предложении WHERE, LEFT JOIN будет преобразован в INNER JOIN, и вы получите пустой результат.
Другой способ - использовать связанный подзапрос NOT EXISTS:
select p.*
from oc_product p
where not exists (
select *
from oc_product_attribute a
where a.product_id = p.product_id
and a.attribute_id = 17
)
Обратите внимание на условие (корреляции) a.product_id = p.product_id
.Если вы пропустите это (как в вашей попытке), подзапрос всегда найдет строку, а NOT EXISTS всегда вернет FALSE.
Оба подхода имеют одинаковую производительность.
Если вам нужен только продуктидентификаторы, которые вы можете заменить p.*
на p.product_id
.