2015-01-05 1 views
1

Это таблица virtuemart_product_categories:Выберите продукт, где она принадлежит в 2 различных категорий

enter image description here

Что я хочу сделать, это выбрать virtuemart_product_id где продукт находится в категории: 307 и категории: 383. Что-то вроде этого: (Я знаю, что выражение «AND» полностью неверно набрало его как пример того, что я пытаюсь достичь).

SELECT * 
FROM uhhu_virtuemart_products_en_gb AS a 
INNER JOIN uhhu_virtuemart_product_categories AS b ON a.virtuemart_product_id=b.virtuemart_product_id 
WHERE b.virtuemart_category_id=307 AND b.virtuemart_category_id=383 

Есть ли SQL способ достичь этого? Может быть, мне нужно, чтобы создать новую таблицу и каким-то образом сделать отношения? Я думал, что действительно хромой путь, используя некоторые PHP и отделить запросы, но даже если он работает это будет быть действительно сложным и плохим способом кодирования. Спасибо заранее.

Edit: Добавление таблицы products_en_gb также:

enter image description here

+0

Вы пробовали 'OR' вместо' AND'? –

+0

У вас есть правильная форма запроса, вы просто проверяете ту же сторону соединения. У вас есть «где b.id = 307 и b.id = 383», что явно невозможно, поэтому вы не получите никаких результатов. Просто измените одно из значений «b» на «a»: «где a.id = 307 и b.id = 383» – TommCatt

ответ

2

Попробуйте это:

SELECT * 
FROM uhhu_virtuemart_products_en_gb AS a 
WHERE a.virtuemart_category_id IN (307, 383) 
GROUP BY a.virtuemart_product_id 
HAVING COUNT(1) = 2 
+0

products_en_gb содержит только идентификатор, имя, часть продукта, а не category_id! – IseNgaRt

+1

^1 Это приятно, так же легко расширяется до большего количества категорий. Однако его можно сломать, случайно присвоив одну и ту же категорию для продукта дважды. –

+0

Хорошо, это сработало! если продукт находится в более чем двух категориях, я должен изменить значение «HAVING COUNT (1) = x» через php, каждый раз? – IseNgaRt

1

Если вы хотите продукт в двух категориях, то вы могли бы присоединиться к uhhu_virtuemart_products_en_gb против itselt, так что у вас есть две колонки категории. Вот простой пример: «то, что должно появиться в строке результата дает мне возможность фильтровать результат»

select p1.product_id from 
product_category p1 
inner join product_category p2 using(product_id) 
where p1.category_id=307 
and p2.category_id=383 

Один из способов подходить к решению проблем, как это спросить себя

Это не единственный способ сделать это, но я думаю, что это довольно простой визуализировать.