2014-09-29 1 views
0

Я пытаюсь решить проблему. Это мой запрос>Mysql - WHERE несколько значений с тем же идентификатором

SELECT p.* 
FROM `ps_product` p 
LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.id_shop = 1) 
LEFT JOIN `ps_product_attribute` pa ON (pa.`id_product` = p.`id_product`) 
LEFT JOIN `ps_product_attribute_combination` pac ON (pac.`id_product_attribute` = pa.`id_product_attribute`) 

WHERE pl.`id_lang` = 2 
AND p.`id_category_default` = 25 
AND p.`active` = 1 
AND pac.`id_attribute` = 1714 
AND pac.`id_attribute` = 1736 
AND pac.`id_attribute` = 1737 
AND pac.`id_attribute` = 216 

ORDER BY p.`price` ASC 

Моя проблема заключается в выборе только продуктов, содержащих все 4 id_attributes.

Таблица ps_product_attribute_combination содержит два столбца. id_product_attribute и id_attribute. Например>

id_attribute/id_product_attribute 
1714    120 
1736    120 
1737    120 
216    120 

Я надеюсь объяснение :) успешное Спасибо!

+0

Ну это не может быть 1714 ** AND ** 1736, используйте IN: 'AND pac.id_attribute IN (1714, 1736, 1737, 216)' –

+0

IN не работает. Он должен иметь все 4. IN будет работать, даже если он не содержит всех 4. – Wr1t3r

ответ

0

Вам нужно зарегистрироваться в четыре раза, по одному для каждого атрибута вы хотите продукт иметь:

SELECT p.* 
FROM `ps_product` p 
JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.id_shop = 1) 
JOIN `ps_product_attribute` pa ON (pa.`id_product` = p.`id_product`) 
JOIN `ps_product_attribute_combination` pac1 ON (pac1.`id_product_attribute` = pa.`id_product_attribute`) 
JOIN `ps_product_attribute_combination` pac2 ON (pac2.`id_product_attribute` = pa.`id_product_attribute`) 
JOIN `ps_product_attribute_combination` pac3 ON (pac3.`id_product_attribute` = pa.`id_product_attribute`) 
JOIN `ps_product_attribute_combination` pac4 ON (pac4.`id_product_attribute` = pa.`id_product_attribute`) 

WHERE pl.`id_lang` = 2 
AND p.`id_category_default` = 25 
AND p.`active` = 1 
AND pac1.`id_attribute` = 1714 
AND pac2.`id_attribute` = 1736 
AND pac3.`id_attribute` = 1737 
AND pac4.`id_attribute` = 216 

ORDER BY p.`price` ASC 
0

Я думаю, что это должно работать:

SELECT p.* 
FROM `ps_product` p 
LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.id_shop = 1) 
LEFT JOIN `ps_product_attribute` pa ON (pa.`id_product` = p.`id_product`) 
LEFT JOIN `ps_product_attribute_combination` pac ON (pac.`id_product_attribute` = pa.`id_product_attribute`) 

WHERE pl.`id_lang` = 2 
AND p.`id_category_default` = 25 
AND p.`active` = 1 
AND 
    (
     pac.`id_attribute` = 1714 
     OR 
     pac.`id_attribute` = 1736 
     OR 
     pac.`id_attribute` = 1737 
     OR 
     pac.`id_attribute` = 216 
    ) 

ORDER BY p.`price` ASC 
+0

Это то же самое, что и IN, но спасибо :) – Wr1t3r

+0

Да, я неправильно прочитал ваш вопрос. Подход RSanchez является правильным. – RayK