2016-04-06 2 views
2

で検索して、この質問、私はそれが皆のために少しより明確になるように、テーブルの名前を変更し、私が達成したいかを説明します:返すオプションを使用して入力フォームがありますMYSQLクエリ明確にするために関係

カテゴリID。 'Product'に 'Category'がある場合は、複数のカテゴリ(またはただ1つ)を持ち、そのカテゴリのすべてがフォームから渡される配列内にあると言うことができる 'Product'を返す/見つけたいと思います。

製品テーブル

ID  Title 
1  Pizza 
2  Ice Cream 

Categoriesテーブル

ID  Title 
1  Baked food 
2  Hot food 

ProductsCategoriesテーブル

ID  ProductId  CategoryId 
1  1    1 
2  1    2 

私が合格している場合、[1,2]、すべてのため、IDが1の製品を返す必要がありますクエリProductsCategoriesは要求された配列内にありますが、1または2だけを渡すと、クエリはn結果。

現在、私の作品次のクエリを持っていますが、私は2番目の製品を作成し、最初の製品と同じ区分を持つProductCategoryを作成した場合、何らかの理由で、クエリはnulll返す...

SELECT products.* 
FROM products 
JOIN products_categories 
ON products_categories.product_id= products.id 
WHERE products_categories.category_id IN (1, 2) 
HAVING COUNT(*) = (select count(*) from products_categories pc 
    WHERE pc .product_id = products.id) 

すべての援助は深く崇拝されています!乾杯!

+0

あなたの質問をクリアするには、単一の商品ではなく、複数のカテゴリのみの商品がほしいですか? – mitkosoft

+0

@mitkosoft、idの[1,2,5,10]でカテゴリを検索すると、すべてのカテゴリがその配列の中にあるすべての製品を取得したいと考えています。つまり、 id 1の商品は、categories_idの1と2のProductsCategoriesのレコードを持ちます。検索配列が[1,2,5,10]の場合、商品は返されますが、category_idの1,2,3のProducsCategories商品8(検索配列に含まれていない)場合は、製品を返さないでください。 私はこのケースがちょっと混乱しているように見えますが、その質問が厳しくない場合は、そのタスクを達成するための他の方法はありません – Cowwando

答えて

0

@mitkosoft、お返事ありがとうございますが、悲しいことに、クエリは必要な結果を生成していません。製品のカテゴリが部分的に渡されたカテゴリにある場合、製品は依然として返されます。また、私はフォームによって送信されたパラメータの数を知りません。

は、幸いにも私は、トリックを行い、(少なくとも今のところ)完全に正常に動作クエリ

SELECT products.*,  
COUNT(*) as resultsCount, 
(SELECT COUNT(*) FROM products_categories pc WHERE pc.product_id = products.id) as categoriesCount 

FROM products 
JOIN products_categories AS productsCategories 
ON productsCategories.product_id= products.id 
WHERE productsCategories.category_id IN (7, 15, 8, 1, 50) 

GROUP BY products.id 
HAVING resultsCount = categoriesCount 
ORDER BY amount DESC#optional 

クエリが柔軟であると私は必要なものを正確に私を与えるその方法を作成するために管理しました! - すべてのカテゴリが検索パラメータ内にある商品(部分的ではない)のみ。

乾杯! :)

1

IN句内のすべての値を一致させるためには、あなただけの他に、知っておく必要がありますがHAVING句でそれを使用する必要があります渡されたカテゴリの数:

SELECT 
    p.*, 
    GROUP_CONCAT(c.title) AS categories 
FROM 
    Products p 
    INNER JOIN ProductsCategories pc ON pc.productId = p.ID 
    INNER JOIN Categories c ON c.ID = pc.categoryId 
WHERE 
    pc.categoryId IN (1,2) 
GROUP BY 
    p.id 
HAVING 
    COUNT(DISTINCT pc.categoryId) = 2 -- this is # of unique categories in IN clause 

だから場合にはIN (1,2)結果は次のとおりです。

+----+-------+---------------------+ 
| id | title | categories   | 
+----+-------+---------------------+ 
| 1 | Pizza | Baked Food,Hot Food | 
+----+-------+---------------------+ 
1 row in set 

IN (1,3)結果がEmpty set(結果なし)である場合。

関連する問題