2017-10-24 7 views
0

私はmysqlデータベースに多種多様なテーブル設定を製品と属性とともに持っています。製品には多くの属性があり、多くの製品に属性を割り当てることができます。Mysql多対多関係 'and'と 'not'データを持つデータを取得する

今私はいくつかの属性が割り当てられているが、いくつかの他の属性は割り当てられていない製品を入手する必要があります。製品は、属性犬や食べ物を持っている必要があり、それはサーモンやチキンを持つことができ、それが持っていなければなりません。この例では

「鮭や鶏肉とし、穀物のないドッグフード」

:それはのような検索質問です粒。

table : product_attributes 
+------------+----------------+ 
| product | attribute | 
+------------+----------------+ 
| Product 1 | Dog   | 
| Product 2 | Cat   | 
| Product 3 | Dog   | 
| Product 1 | Food   | 
| Product 2 | Food   | 
| Product 3 | Food   | 
| Product 1 | Salmon  | 
| Product 2 | Chicken  | 
| Product 3 | Salmon  | 
| Product 1 | Chicken  | 
| Product 3 | Grain  | 
| Product 4 | Dog   | 
| Product 4 | Food   | 
| Product 4 | Cow   | 
+------------+----------------+ 

我々は、検索質問をピックアップしている場合、私はそれが犬、食品サーモン/チキンと一致し、それは穀物の属性を持っていないため、製品1は、表示したいです。プロダクト2はDog属性と一致せず、プロダクト3は必要としないグレイン属性を持ちます。だけは本当に「と」の関係犬&食品を選ぶ

+------------+ 
| product | 
+------------+ 
| Product 1 | 
+------------+ 

は問題ありませんが、私は「または」関係とクエリ

select product 

from product_attribute 

where attribute in ('dog', 'food') 

group by product 

having count(attribute) = 2 


+------------+ 
| product | 
+------------+ 
| Product 1 | 
+------------+ 
の「ない」の関係を取得する必要があるとき、私はこだわっていますいくつかのデータと

単純なSQLフィドルは、ここで見つけることができます:http://www.sqlfiddle.com/#!9/e2ed09/4

よろしく、

マルタインBastiaansen

答えて

0

あなたは、ほとんど存在し、我々は唯一の「と」関係と「ない」関係を持っている場合はちょうどそれが働いているOR

select product 
from product_attribute 
where attribute in ('dog', 'food') and 
     not exists(
      select 1 
      from product_attribute pa2 
      where pa2.product = product_attribute.product and 
       pa2.attribute in ('grain') 
    ) and 
     exists(
      select 1 
      from product_attribute pa2 
      where pa2.product = product_attribute.product and 
       pa2.attribute in ('salmon', 'chicken') 
    ) 
group by product 
having count(distinct attribute) = 2 
+0

解決するためにあなたがしたくない製品とexistsを除外するためにnot existsを使用しますが、どのように 'サケ'または 'チキン'の 'または'のステートメントをクエリで処理できますか? 私はいくつかの余分なデータを使って質問とフィドルを編集しました。そのため、クエリは1の代わりに2つの製品に一致します。 –

+0

@MartijnBastiaansen今すぐチェックしてください –