2011-01-30 11 views
2

私はシステムに情報を正しく返すようにしましたが、フィルタ適用時に情報を返す問題があります。問題のクエリは次のとおりです。製品は以下の属性を持っている場合、私は仕事に取得しようとしています何(JSONデータとしてなど属性を返す)CONCATの事を無視製品とその属性を別のテーブルから返す方法

SELECT `products`.* 
CONCAT('[', GROUP_CONCAT(DISTINCT '{', '"id":"', `product_variations`.`id`, '"', ',', '"id_product":"', `product_variations`.`id_product`, '"', ',', '"sku":"', `product_variations`.`sku`, '"', ',', '"options":"', `product_variations`.`options`, '"', ',', '"quantity":"', `product_variations`.`quantity`, '"', ',', '"price":"', `product_variations`.`price`, '"', '}' SEPARATOR ','), ']') as `_variations`, 
CONCAT('[', GROUP_CONCAT(DISTINCT '{', '"id":"', `product_images`.`id`, '"', ',', '"id_product":"', `product_images`.`id_product`, '"', ',', '"location":"', `product_images`.`location`, '"', ',', '"order":"', `product_images`.`order`, '"', ',', '"variation_key":"', `product_images`.`variation_key`, '"', ',', '"variation_values":"', `product_images`.`variation_values`, '"', '}' SEPARATOR ','), ']') as `_images`, 
CONCAT('[', GROUP_CONCAT(DISTINCT '{', '"id":"', `product_attributes`.`id`, '"', ',', '"id_product":"', `product_attributes`.`id_product`, '"', ',', '"key":"', `product_attributes`.`key`, '"', ',', '"value":"', `product_attributes`.`value`, '"', '}' SEPARATOR ','), ']') as `_attributes` 
FROM (`products`) 
LEFT JOIN product_variations ON products.id = product_variations.id_product 
LEFT JOIN product_images ON products.id = product_images.id_product 
LEFT JOIN product_attributes ON products.id = product_attributes.id_product 
WHERE (`products`.`id_category` = "11" OR `products`.`id_category` = "12" OR `products`.`id_category` = "9") 
AND (product_attributes.key = "color" AND product_attributes.value IN ("Red","Orange")) 
AND (product_attributes.key = "size" AND product_attributes.value IN ("L","M")) 
GROUP BY `products`.`id` 
LIMIT 10 

は、例えば、次のとおりです。

私はこの製品が返される

color=Red OR color=Orange 
AND 
size=L OR size=M 

の製品を表示したい場合は

color=Red 
color=Orange 
color=Blue 
size=L 
size=M 
size=S 

ので、 問題がobviusly事実にある

AND (product_attributes.key = "color" 
AND (product_attributes.key = "size" 

それは、真であるが、私はそれは子供たちのいずれかになりたい、それが唯一の1のフィルタであれば、それが正常に動作しますが、複数の「異なる」フィルタと、それは壊し、また

することはできませんフィルターを通過した問題の属性のみを返します。

フィルタに合格した製品のすべての属性を返すことを望みますが、これ以上は考えられません。誰かがこれをやる方法を知っていますか?

+0

グループの使用を復帰を許可しないことにより、すべての私の問題の両方のアカウントに取り組んでいる、すごい – ajreal

答えて

1

あなたはHAVING句、例のロジックを記述する必要があります:

HAVING COUNT(IF(product_attributes.key = "color" AND product_attributes.value IN ("Red","Orange"), 
    1, NULL)) > 0 
    AND COUNT(IF(product_attributes.key = "size" AND product_attributes.value IN ("L","M"), 
    1, NULL)) > 0 
+0

属性:Dのmuchosのおかげで、あなたは自分自身のためにこれを理解しようとしている拷問の時間から私を救ったのです:) –

関連する問題