Как вернуть товар и все его атрибуты из другой таблицы при фильтрации по одному из них - PullRequest
2 голосов
/ 30 января 2011

Я заставил нашу систему возвращать информацию правильно, однако теперь у меня есть проблема с возвратом информации, когда мы применяем фильтры. рассматриваемый запрос:

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

Игнорирование вещей CONCAT (которые возвращают атрибуты и т. Д. В виде данных json), что я пытаюсь заставить работать, например, если продукт имеет следующие атрибуты:

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

, так что если я хочу отобразить продукты, где

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

этот товар будет возвращен, проблема явно заключается в том, что

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

не может быть правдой, но я хочу, чтобы это было ЛЮБОЕ из дочерних элементов, если это только 1 фильтр, он работает нормально, но несколько «разных» фильтров и он ломается,

также он будет возвращать только те атрибуты, о которых идет речь, которые прошли фильтр.

Я хотел бы, чтобы он возвращал ВСЕ атрибуты для продукта, который прошел фильтр, чем больше я смотрю на это, тем больше я думаю, что это невозможно. Кто-нибудь знает способ сделать это?

1 Ответ

1 голос
/ 30 января 2011

Вам необходимо написать логику в предложении 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
...