我有一张表将产品映射到类别。每个产品可以属于多个类别,因此产品可以具有多个具有不同类别ID的行。它看起来像这样:
CREATE TABLE `products_mid` (
`id` int(11) UNSIGNED NOT NULL,
`product_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
`category_id` int(11) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
如果我想获得类别A
中所有产品ID的列表,这些列表足够简单 - 但是有没有办法让所有product_id
属于类别{{1} }},A
和 B
尽可能简单?
答案 0 :(得分:3)
更好的方法是使用HAVING
子句,而不是WHERE
子句。按product_id
分组,并选择三个类别中每个类别的非零数量的行,如下所示:
SELECT product_id
GROUP BY product_id
HAVING SUM(CASE WHEN category_id=1 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN category_id=2 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN category_id=3 THEN 1 ELSE 0 END) > 0
上述声明选择属于ID为1,2和3的所有三个类别的product_id
个产品。
答案 1 :(得分:2)
会是这样的:
select product_id from products_mid
where
category_id in (1,2,3)
group by product_id
having count(distinct category_id)=3
答案 2 :(得分:1)
另一种方式:
$http.get('http://localhost:8090/test__2/',{withCredentials: true}).then
虽然产品也可能属于其他类别,但它会在1到3类中找到所有产品。如果您想要的产品专门属于第1类到第3类,而没有其他产品,那么我们就必须对查询进行重新定义。
答案 3 :(得分:1)
使用intersect
运算符查找三个单独查询的公共值。
select product_id from products_mid where category_id = 1
intersect
select product_id from products_mid where category_id = 2
intersect
select product_id from products_mid where category_id = 3