これは関係分割の場合です:
SELECT c.id, c.name
FROM components_componentproperty cp1
JOIN components_componentproperty cp2 USING (component_id)
JOIN components_component c ON c.id = cp1.component_id
WHERE cp1.property_id = 9102 AND cp1.value IN ('4015', '4016')
AND cp2.property_id = 8801 AND cp2.value = '3'
AND c.type_id = 3832
GROUP BY c.id;
ここに関連するテクニックの武器を集めました:
多数のプロパティを確認する
上記のクエリを拡張すると、プロパティがいっぱいの手にとって、それは可能な限り最速のソリューションの1つになります。数が多いほど、このルートを使用する方が便利です(また、高速になり始めます)。
5つのプロパティの例、必要に応じて展開:
SELECT c.id, c.name
FROM (
SELECT id
FROM (
SELECT component_id AS id, property_id -- alias id just to shorten syntax
FROM components_componentproperty
WHERE property_id IN (9102, 8801, 1234, 5678, 9876) -- expand as needed
GROUP BY 1,2
) cp1
GROUP BY 1
HAVING count(*) = 5 -- match IN expression
) cp2
JOIN components_component c USING (id);
内部サブクエリcp1
の追加ステップ (component_id, property_id)
ごとに明らかに複数のエントリがあるため、必要なのは components_componentproperty
内 。 できた cp1
を折りたたむ およびcp2
1つにまとめて確認
HAVING count(DISTINCT property_id) = 5
しかし、count(DISTINCT col)
なので、もっと高くつくと思います。 行ごとに1回の並べ替え操作が必要です 。
非常に長いリストの場合IN
悪い選択です。検討してください: