2012-01-11 13 views
1

クエリの結果に関連するすべてのカテゴリidをどのように返しますか? I以下のクエリで結果に基づいて空のカテゴリを削除しますか?

items_cats: (many to many) 
product_id | category_id 
==================== 
1   | 1 
1   | 2 
1   | 4 
1   | 7 

2   | 1 
2   | 3 
2   | 4 
2   | 7 

3   | 1 
3   | 3 
3   | 4 
3   | 8 

は3 CATEGORY_IDと7
をCATEGORY_ID含むすべての製品IDを取得しかし、私はまた、(オプション)がまだ選択にのproducs_id基盤を持っているCATEGORY_ID年代知りたい:

たとえば、私はこのクエリを返す(コード例に基づいて)したい:
-product_id = 2
-category_idさん:7、3、4、

1本を使用して、私はおそらく、クエリをlimetしたいですよ1ページあたりの最大アイテム数。私は

コード、これまでに得たveは:猫のidのための緩いクエリで

SELECT 
     DISTINCT t1.product_id, t1.category_id 
    FROM 
     items_cats t1 
    INNER JOIN 
     items_cats t1b 
     ON t1.product_id =t1b.product_id 
    WHERE 
     t1.category_id=3 AND 
     t1b.category_id=7 

問題:もちろん

SELECT 
     e1.category_id 
    FROM 
     drinks_ingredients e1  
    WHERE 
     e1.category_id=2 

それは2を返しますが、私はそれを返すのが好き1、2、 4、7

他の方法で仕事をしていますが、これを多くの製品やカテゴリで効率的にするにはどうすればよいですか?これらのクエリを組み合わせることはできますか。

SELECT DISTINCT 
     t1.category_id 
    FROM items_cats t1 
    WHERE t1.product_id = 2 
+0

この 'iid'列がどのようなものです:product_idは、前の表にある場合 はその後、我々はただ、すべてのcategory_idを選択しますか? –

+0

は間違いでしたが、それはあなたがあなたの解決のためにあなたにタンク – Hank12312

答えて

1

これを行う方法はほかにもありますが、ここにはあります。

まず、私たちが興味を持っているどのproduct_idのワークアウトする必要があります。各product_idの中でどのように多くの必要なカテゴリの数えることができます。私たちは2 category_id(3と7を指定しているので

SELECT product_id, count(category_id) as numcats 
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id; 
+------------+---------+ 
| product_id | numcats | 
+------------+---------+ 
|   1 |  1 | 
|   2 |  2 | 
|   3 |  1 | 
+------------+---------+ 

)、私たちはproduct_idに興味があります。count(category_id) = 2です。だから、最後にHAVING numcats=2を追加しますので、ここで

SELECT product_id, COUNT(category_id) as numcats 
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id 
HAVING numcats=2; 
# (returns all product_id with both category_id=3 and 7. 

は、我々がcategory_id秒をしたいすべてのproduct_id秒です。

SELECT DISTINCT category_id 
FROM items_cats 
WHERE product_id IN 
    (SELECT product_id 
    FROM items_cats 
    WHERE category_id IN (3,7) 
    GROUP BY product_id 
    HAVING COUNT(category_id)=2); 

+-------------+ 
| category_id | 
+-------------+ 
|   1 | 
|   3 | 
|   4 | 
|   7 | 
+-------------+ 
+0

になるはずです。私はいくつかのパフォーマンステストを行った。ネストされたセットのdbデザインを使用すると、このケースに対するクエリの時間が短縮されると思いますか? – Hank12312

+0

残念ながら私はパフォーマンス面でデータベース設計モデルについて何も知らない:( –

関連する問題