从表中选择WHERE值跨越多行

时间:2017-03-10 01:06:05

标签: mysql sql

我有一张表将产品映射到类别。每个产品可以属于多个类别,因此产品可以具有多个具有不同类别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尽可能简单?

4 个答案:

答案 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