0

テーブル製品とテーブルタグがあり、両方に次のフィールドがあります:

id | name
1  | chair
2  | table

およびリンク テーブル product_tags:

id | productId | tagId
1  | 1         | 1
2  | 1         | 2
3  | 2         | 1
4  | 2         | 2
5  | 2         | 3
6  | 2         | 4

商品は検索結果に表示され、ユーザーがいくつかのタグにチェックを入れると絞り込むことができます。したがって、product_tags で選択したすべてのタグを持つ製品のリストを返すクエリが必要です。たとえば、上記の表で、ユーザーがタグ 1、2、および 3 にチェックマークを付けた場合、クエリは製品 2 のみを返す必要があります。

このクエリには、この質問をより複雑にするだけの非常に多くの結合があるため、現在のクエリ (少なくとも 1 つのタグを持つすべての製品を選択するクエリ - これを "has allタグ」)は次のとおりです。

SELECT DISTINCT p.id, p.name
FROM products AS p
JOIN product_tags AS pt ON p.id = pt.productId
WHERE pt.tagId IN (tag1, tag2, tag3, ...) //the line that will be removed

where ステートメントで COUNT() を使用して、タグのリストから各製品の tagId の数を取得し、入力されたタグの数と等しくなるように WHERE ステートメントを使用することを考えていました。しかし、それはやり過ぎかもしれません。その上で、実行時間が優先されます。どう思いますか?前もって感謝します!

4

1 に答える 1