必要なすべてのプロパティに一致する特定の属性が結合テーブルに格納されている製品をフィルタリングする必要があります。つまり、要件を追加して検索範囲を絞り込んでください。1つの列でグループ化された行を別の列に必要な値でグループ化する方法
問題は、実際には製品特性の次(簡体字)表を与えられ、参加するのではなく、私は思うのプロパティテーブルに関する:
id product_id property value --------------------------------- 1 1 color red 2 1 size small 3 2 color red 4 2 size large
は、どのように私は 'の値が両方あるすべてproduct_idsになるだろう赤 "と"小 "?
似たような質問was asked非常に完全に答えられていません。解決策は、COUNTおよびHAVINGを含み、必要な値と同じ数の行が各グループに存在する行を取得します。
SELECT product_id, count(*) AS group_count FROM properties where
value = 'red' OR value = 'small'
GROUP BY product_id
HAVING group_count = 2
これは機能しますが、パフォーマンスについて心配です。より良い方法があるようです。
結局、これはと結合する必要があるであろう、あるいは少なくともproductsテーブルをフィルタリングするために使用:
id name ------------- 1 Product 1 2 Product 2
私は、私はフィルタリングする必要がある製品にこれらのプロパティテーブルの2に参加していることを言及するのを忘れてしまいました1つは製品の通常の属性、もう1つは利用可能な設定可能なオプション(バリエーションのようなビット)です。 ユーザーが次のような製品をフィルタできるようにすることです: "gender = '男性'、brand = 'nike'、およびサイズ== 'small'のジェンダーとブランドが 'プロパティ'で、サイズがオプションである
カウントを持つグループを使用するソリューションは、まだ結合された2つのテーブルで動作しますが、面倒ですが、必要なグループ数は、最初のテーブルの必要なオプションの数に、二番目。
プロパティ(および他のテーブル)からIDを取り出して、次に選択するだけです.ID IN(ids)は、両方のプロパティテーブルのIDのセットと一致していますが、私はこれを行うアイデアが気に入らないしかし本当に長いidsのリストを持っています。
例でgroup_countが2より大きい場合はどうなりますか?彼らは除外されます。私はあなたがそれを持つ必要があると思うgroup_count> 0 – Eppz