このクエリを期待どおりに機能させるには、いくつかの問題があります。
products
、product_attributes
およびの 3 つのテーブルがありattributes
ます。
関連性が明らか(商品は複数の属性を持つことができる)
products
---------
id
product_attributes
------------------
product_id
attribute_id
attributes
----------
id
name
私が達成したいのは、指定された属性のリストを持つ製品を取得することですが、目的の属性の部分的なリストしか持たない製品を省略します。
たとえば、次の製品と属性があるとします。
- 靴1【青、男の子】
- 靴2【青、女の子】
- 靴 3 [赤,男の子]
- 靴 4 [赤,女の子]
[blue,boy] を含む製品を求めるクエリは、 のみを取得しますShoe 1
。
[青] の付いた製品を問い合わせるクエリでは、何も返されません。
今以来、私はこのクエリで作業していました:
SELECT p.*, pa.attribute_id
FROM products AS p
LEFT JOIN product_attributes AS pa ON(pa.product_id=p.id)
WHERE
pa.attribute_id IN(' . implode(',', $attr_ids) . ')
GROUP BY p.id
HAVING count(pa.attribute_id)=' . count($attr_ids)
属性のみが指定された場合、その属性を持つすべての製品が返されるため、これは失敗します。