2015-03-01 4 views
0

Как получите продукты имущих все запрошенные атрибутыMySQL фильтры продукта по нескольким атрибутам

SELECT * FROM `oc_product_attribute` WHERE (`attribute_id`=15 AND `text`="2500") OR (`attribute_id`=18 AND `text`="24") 

этот запрос, возвращается следующий результат:

|product_id | attribute_id | language_id | text 
+-----------+--------------+-------------+----- 
|1   | 15   | 1   | 2500 
|2   | 15   | 1   | 2500 
|3   | 15   | 1   | 2500 
|4   | 15   | 1   | 2500 
|3   | 18   | 1   | 24 
|4   | 18   | 1   | 24 

, но мне нужно только продукт 3 и 4, потому что у них есть 15 = 2500 и 18 = 24. Как я это делаю?

+0

Вы уже знаете, как использовать предложение WHERE, но вы не знаете, как добавить фильтр для 'product_id'? – Tom

+0

@Tom И какой фильтр это будет? – Strawberry

+0

@Strawberry, это таблица атрибутов продуктов, и я получаю файлы с фильтрацией по возвращенному идентификатору продукта. Мой вопрос не совсем понять. Но в любом случае спасибо за помощь. Я достиг желаемого результата. – Sasay

ответ

1
SELECT product_id 
    FROM oc_product_attribute 
WHERE (attribute_id,text) IN ((15,'2500'),(18,'24')) 
GROUP 
    BY product_id 
HAVING COUNT(DISTINCT attribute_id,text) = 2; 

У меня есть ощущение, что это сокращенная отрицает использование индексов, но мы надеемся, вы получаете идею.

+0

если первая строка 'SELECT DISTINCT product_id AS product_id' и последняя строка' HAVING COUNT (product_id) = 2', это работает, но я не уверен. – Sasay

+0

Ну, вы не показали нам свою схему/набор данных, так что только вы можете знать – Strawberry

1

Если вы хотите, чтобы соответствовать несколько условий и возвращает значение, соответствующие все условия здесь есть способ сделать это

select p1.* from oc_product_attribute p1 
where 
p1.`attribute_id`=15 AND p1.`text`='2500' 
and exists 
(
    select 1 from oc_product_attribute p2 
    where 
    p2.attribute_id = 18 
    and p2.text = 24 
    and p1.product_id = p2.product_id 
) 
union all 
select p1.* from oc_product_attribute p1 
where 
p1.`attribute_id`=18 AND p1.`text`='24' 
and exists 
(
    select 1 from oc_product_attribute p2 
    where 
    p2.attribute_id = 15 
    and p2.text = 2500 
    and p1.product_id = p2.product_id 
) 
; 
+0

Хорошо, возможно ли выполнить такой запрос, который DISTINCT by product_id? – Sasay

+0

хорошо отличные будут возвращать только один продукт из каждого критерия. –

Смежные вопросы