найти элементы, которые имеют 2 ассоциации (вместе), используя mysql - PullRequest
0 голосов
/ 10 августа 2011

У меня есть база данных с 3 таблицами:

product (id, name, price, ...)
product_option (id, product_id, option_id)
option (id, value)

продукты имеют много вариантов

Например, мне нужно найти продукт с опцией A и с опцией B, а не продукт с опцией A.

Я использую что-то вроде этого:

select * from product
left join product_option on product_option.product_id = product_id

where product_option.option_id in (1,2,3) 
and product_option.option_id in (4)
group by product.id

Конечно, результат всегда пуст. Мне нужны эти продукты с option_id (1 или 2 или 3) и 4

Как я могу это сделать?

Ответы [ 5 ]

1 голос
/ 10 августа 2011

Я не настроил ваши таблицы в моей собственной БД, но недавно я сделал нечто подобное.Попробуйте это:

SELECT * FROM product, product_option AS PO1, product_option AS PO2
WHERE product.id = PO1.product_id
  AND product.id = PO2.product_id
  AND PO1.option_id IN (1, 2, 3)
  AND PO2.option_id = 4;
1 голос
/ 10 августа 2011
SELECT *
  FROM product p
 WHERE EXISTS (
        SELECT *
          FROM product_option
         WHERE product_id = p.id
           AND option_id in (1, 2, 3)
       )
   AND EXISTS (
        SELECT *
          FROM product_option
         WHERE product_id = p.id
           AND option_id = 4
       )
1 голос
/ 10 августа 2011

так как вы хотите два разных совпадения, вам нужно присоединиться к product_option twise

select * from product
left join product_option AS po1 on product_option.product_id = product_id
left join product_option AS po2 on product_option.product_id = product_id

where po1.option_id in (1,2,3) 
and po2.option_id in (4)
group by product.id
1 голос
/ 10 августа 2011
WHERE
(option_id IN (1,2) AND option_id NOT IN (3,4)) 
OR   
(option_id IN (4) AND option_id NOT IN (1,2,3)) 

Не уверен, что я правильно понял комбинации пар, поэтому надеюсь, что вы поняли идею

1 голос
/ 10 августа 2011
select *
from product as p
inner join (product_option as po, product_option as po2)
on p.product_id=po.product_id and p.product_id=po2.product_id
where po.option_id=4 and po2.option_id in(1,2,3)
group by p.product_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...