2

これが以前に尋ねられた場合は申し訳ありませんが、何を検索すればよいか本当にわからなかったため、質問のタイトルをどのように表現すればよいかわかりませんでした。

私は、1 つの製品が複数のカテゴリを持つことができ、フロントエンドでユーザーが複数のカテゴリを指定して製品を検索できる、非常に一般的なシステムを構築しています。

次のスキーマとデータがあるとします (まだ画像を投稿できません。申し訳ありませんが、リンクを参照してください)-

テーブル名: product_categories

データ:

ここに画像の説明を入力

製品テーブルは非常に標準的です - ID、名前、金額など.

したがって、製品 1 には 2 つのカテゴリがあります。

ユーザーが検索ページでカテゴリ 2 と 3 を表す 2 つのチェックボックスをオンにした場合、これらのカテゴリの両方を持つ製品のみが返されるようにクエリを実行するにはどうすればよいですか?

2 のカテゴリ ID と 3 のカテゴリ ID を持つ行が 1 つもないため、次のようなものは機能しません。

SELECT * from product_categories where `category_id` = 2 AND `category_id` = 3;

WHERE IN も使用してみましたが、カテゴリ ID 2 と 6 (たとえば) の両方を持つ製品を探していたとしても、これは製品 1 を返します。

これはより大きなクエリの一部ですが、解決策を見つけることができれば、解決策を適用できます。

4

3 に答える 3

0

この道に沿って何かがうまくいくはずです

SELECT * FROM products WHERE 
    EXISTS (SELECT * FROM product_categories 
            WHERE product_id = products.id AND category_id = 2) 
    AND 
    EXISTS (SELECT * FROM product_categories 
            WHERE product_id = products.id AND category_id = 3)
    ...

他の解決策は、カテゴリごとに JOIN を生成することです。

SELECT * FROM products
JOIN product_categories AS cs1 ON cs1.product_id = products.id 
                               AND cs1.category_id = 2
JOIN product_categories AS cs2 ON cs2.product_id = products.id 
                               AND cs2.category_id = 3
...

product_categories が数千万行を超えると予想しない限り、正しいインデックスが作成されていれば、どちらのソリューションも適切に機能するはずです。

于 2012-10-27T10:46:15.283 に答える
0

ここでサブクエリを使用する必要があると思います:

SELECT * from product_categories where id IN (SELECT id from product_categories where `category_id` = 2) AND IN (SELECT id from product_categories where `category_id` = 3)

これが機能するかどうかは100%確信が持てません(SQLを使用してから長い間)

于 2012-10-27T10:48:08.027 に答える
0

提案してくれてありがとう、どうもありがとう。解決策が見つかったと思います。これは期待される結果を生成するようですが、メソッドが機能することを確認するために、さらに単体テストを作成します。

私が見つけた解決策は次のとおりです。

select * from products_categories where category_id in (2,3) HAVING count(distinct(id)) = 2 

したがって、これは WHERE IN を使用しますが、HAVING を使用して、返された一意のレコードの数をチェックし、提供されたカテゴリの数と等しいことを確認します。

乾杯、ダレン

于 2012-10-28T10:12:57.347 に答える