2011-01-01 8 views
1

クエリを定義する際にいくつか問題があります。 私はProductテーブルとCategoryテーブルを持っています。製品は複数のカテゴリに属し、その逆もあります。そのため、Product-Categoryテーブルもあります。クエリをn-mテーブルで定義する方法

今、特定のカテゴリに属する​​すべての製品を選択したいと考えています。しかし、ユーザーがカテゴリを提供していない場合は、すべての製品が必要です。結合を使用してクエリを作成しようとしましたが、複数のカテゴリに属する​​場合(特定のカテゴリがクエリされていない場合)、製品が複数選択されています。

どのような種類のクエリを作成する必要がありますか?

おかげ

+0

これに対して2つの異なるクエリを使用します。あなたがそれによってフィルタリングしないならば、接合テーブルに全く合流するポイントはありません。 –

答えて

2

用途:

SELECT p.* 
FROM Products p 
INNER JOIN ProductCategory pc ON p.id = pc.product_id 
WHERE pc.category_id = 42 

もちろんの正しいテーブル名や列名と適切なカテゴリIDを、置き換えます。あなたが言及したように、あなたは1つのカテゴリから製品を得るため、これは各製品の1つだけになります。クエリにCategoryテーブルが必要ないことに注意してください。

編集:

@Martinはどこか、カテゴリを指定しない場合に述べたように、単にデータベースからすべての製品を取得するためのビジネスロジックを変更する(すなわち、SELECT * FROM Products)。

+0

質問から、これはOPがすでに試みていたものですが、誰が知っていると思いますか?彼らは不注意によるデカルト結合を行った可能性があります。 –

+0

@マーティンええ、どういうわけか、カテゴリテーブルを取得したり、間違ったジョインを使用したりしたと思われます。 @ user559889ああ、今あなたの編集が見えます。私は@Martinに同意します。自分が言ったことをちょうどやるべきです:特定のカテゴリのすべての製品を入手するか、カテゴリが指定されていない場合はすべての製品を入手してください。 –

0
SELECT p.* 
FROM p 
,  pc 
WHERE p.id = pc.productid 
AND pc.categoryid = <targetcategory> 

このようなものはありますか?

+0

申し訳ありませんが、私は非常に明確ではありませんでした。問題はカテゴリが提供されないことがあるため、すべての商品を返品したいということです。しかし、製品が複数のカテゴリに属している場合は、重複した製品を取得します。 – user559889

関連する問題