2017-03-10 4 views
1

商品をカテゴリにマッピングするテーブルがあります。各製品は複数のカテゴリに属する​​ことができるため、製品は異なるカテゴリIDを持つ複数の行を持つことができます。それは次のようになります。私はシンプルenough--だけど、彼らはカテゴリAに属するすべてのproduct_id秒を取得する方法があるカテゴリAにあるすべての製品IDのリストを取得したい場合はテーブルからのSELECT複数の行にまたがる値

CREATE TABLE `products_mid` (
    `id` int(11) UNSIGNED NOT NULL, 
    `product_id` int(11) UNSIGNED NOT NULL DEFAULT '0', 
    `category_id` int(11) UNSIGNED NOT NULL DEFAULT '0' 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

BおよびCは可能な限り簡単ですか?

+0

残りの列に完全に満足できるナチュラルキーがあるように見えるので、この表のサロゲートID列は冗長であるようです。 – Strawberry

答えて

3

より良いアプローチは、節ではなくHAVING節で行います。 product_idによってグループ、そしてあなたの三つのカテゴリーのそれぞれの非ゼロカウントを持つ行を選択し、次のように:

SELECT product_id 
GROUP BY product_id 
HAVING SUM(CASE WHEN category_id=1 THEN 1 ELSE 0 END) > 0 
    AND SUM(CASE WHEN category_id=2 THEN 1 ELSE 0 END) > 0 
    AND SUM(CASE WHEN category_id=3 THEN 1 ELSE 0 END) > 0 

上記の文は、IDが1、2と3つのすべてのカテゴリに属している製品のproduct_id Sを選択し、 3.

1

別の方法:製品はまた、他のカテゴリに属している可能性が

SELECT product_id 
FROM products_mid 
WHERE category_id IN (1, 2, 3) 
GROUP BY product_id 
HAVING COUNT(DISTINCT category_id) = 3 

これは、カテゴリー1〜3のすべての製品を見つけるだろう。カテゴリ1から3までに属し、他のカテゴリに属していない製品が欲しい場合は、クエリを言い換える必要があります。

2

このようなものになります。

select product_id from products_mid 
where 
category_id in (1,2,3) 
group by product_id 
having count(distinct category_id)=3 
1

3つの別々のクエリの共通の価値観を見つけるために、intersect演算子を使用します。

+0

注意:intersectはMySQLでは利用できませんので、この特定の質問に対しては良い答えではありませんが、ほぼすべての他のデータベースシステムでサポートされているので、そのまま使用します。 – NineBerry

関連する問題