我不确定我是否正确地表达了这个问题,所以请随时纠正我。以下是包含其数据的表格:
product category category_product
------- -------- ----------------
id_product id_category active id_category id_product
1 1 1 1 1
2 2 1 2 1
3 3 0 1 2
4 0 2 2
3 2
3 3
4 3
我只需选择那些所有类别为非活动的产品。 例如:
1
很好,因为它属于有效类别(1
,2
)。2
很好,因为它至少有一个有效类别(1
,2
; 3
- 无效)3
,因为其所有类别均处于非活动状态(3
,4
)。我有以下查询,这显然不正确,因为它选择了两种产品:2
和3
:
SELECT p.id_product
FROM product p
JOIN category_product cp
ON p.id_product = cp.id_product
JOIN category c
ON c.id_category = cp.id_category
WHERE
c.active = 0;
这是SQL小提琴:http://sqlfiddle.com/#!2/909dd/2/0
我该如何解决这个问题?
答案 0 :(得分:3)
这样您就可以选择没有活动类别的产品。
SELECT p.id_product
FROM product p
WHERE NOT EXISTS
(SELECT * FROM
category_product cp
INNER JOIN category c ON c.id_category = cp.id_category
WHERE p.id_product = cp.id_product AND c.active = 1);
答案 1 :(得分:0)
这是我在尝试时得到的......如果出现任何问题,请道歉
set @count:=0;
select a.id_product,a.times from
(SELECT count(p.id_product)times, p.id_product, c.active,
if(c.active!=0, @count:=@count+1, @count:=0) x
From category_product cp
join product p
on (p.id_product = cp.id_product)
join category c
on(c.id_category = cp.id_category )
group by id_product )a
where a.x=0;
答案 2 :(得分:0)
请考虑以下事项:
SELECT p.*
, COUNT(*)
, SUM(c.active = 1) active
, SUM(c.active = 0) inactive
FROM product p
JOIN category_product cp
ON cp.id_product = p.id_product
JOIN category c
ON c.id_category = cp.id_category
GROUP
BY p.id_product;
+------------+----------+--------+----------+
| id_product | COUNT(*) | active | inactive |
+------------+----------+--------+----------+
| 1 | 2 | 2 | 0 |
| 2 | 3 | 2 | 1 |
| 3 | 2 | 0 | 2 |
+------------+----------+--------+----------+
http://sqlfiddle.com/#!2/909dd/55
这个问题的最后一部分留给读者练习