1

このクエリを期待どおりに機能させるには、いくつかの問題があります。

productsproduct_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)

属性のみが指定された場合、その属性を持つすべての製品が返されるため、これは失敗します。

4

2 に答える 2

2
-- PHP (or any other languaje) parts are hardcoded here!!!!

SELECT p.*, hma.howmuchattr
-- howmuchattr is needed by HAVING clause, 
-- you can omit elsewhere (by surrounding SELECT or by programming languaje)

FROM products AS p 
LEFT JOIN product_attributes AS pa ON pa.product_id = p.id 
LEFT JOIN (
    SELECT product_id, count(*) as howmuchattr
    FROM product_attributes 
    GROUP BY product_id
) as hma on p.id = hma.product_id

WHERE 
pa.attribute_id IN 
(1,3)                    -- this cames from PHP (or any other languaje). Can be (1) for the other case
GROUP BY p.id
HAVING count(*) = howmuchattr;

こちらのsqlfiddleを参照してくださいこの回答
も参照してください

于 2013-06-28T13:34:04.597 に答える
0

他の問題は別として、このクエリ...

  SELECT p.*
       , pa.attribute_id
    FROM products p 
    LEFT 
-- OUTER (this keyword is optional in MySQL)
    JOIN product_attributes pa 
      ON pa.product_id = p.id
   WHERE pa.attribute_id IN('$attr_ids')
   GROUP 
      BY p.id
  HAVING COUNT(*) = $cnt;

... は ... と論理的に同一です。

  SELECT p.*
       , pa.attribute_id
    FROM products p 
-- INNER (this keyword is also optional in MySQL)
    JOIN product_attributes pa 
      ON pa.product_id = p.id
   WHERE pa.attribute_id IN('$attr_ids')
   GROUP 
      BY p.id
  HAVING COUNT(pa.attribute_id) = $cnt;

OUTER JOIN の有用性を維持するために、次のように書き直すことを検討してください...

  SELECT p.*
       , pa.attribute_id
    FROM products p 
    LEFT 
    JOIN product_attributes pa 
      ON pa.product_id = p.id
     AND pa.attribute_id IN('$attr_ids')
   GROUP 
      BY p.id
  HAVING COUNT(pa.attribute_id) = $cnt;
于 2013-06-28T13:31:00.477 に答える