加入查询,基于列的分组和子计数

时间:2016-02-14 12:50:05

标签: mysql sql count

我有一个名为products的表,我的查询从中检索不同的和分组的行,按product_type_id分组。
这是查询,它可以正常工作

SELECT p.*, count(p.id) as count, pt.name from products p
LEFT JOIN product_types pt on pt.id = p.product_type_id
where client_id = 777
group by product_type_id

然而,这还不够,我想要activated列(布尔类型)和未激活列的子计数。

我想获取每一行,设置为true的产品的子计数和设置为false的产品的子计数。我想把它们作为相关行中的另一栏。

有可能吗?

2 个答案:

答案 0 :(得分:1)

如果您想要一个计数为activated的单独列,则可以使用条件聚合:

select p.*, count(p.id) as count, pt.name,
       SUM(activated) as numActivated,
       (COUNT(*) - SUM(activated)) as numNotActivated
from products p left join
     product_types pt
     on pt.id = p.product_type_id
where client_id = 777
group by product_type_id;

MySQL将布尔值视为数字上下文中的整数,其中1表示true,0表示false。因此,您只需添加值即可获得计数。

编辑:

如果您想要单独的行,请将其包含在GROUP BY

select p.*, activated, count(p.id) as count, pt.name
from products p left join
     product_types pt
     on pt.id = p.product_type_id
where client_id = 777
group by product_type_id, activated;

答案 1 :(得分:1)

如果您使用的是BIT列类型,则可能需要将其转换为整数。

我建议使用CASE select语句或subselect。

即,

<强>激活

sum(CAST(activated as INT)) as TotalActivated

(select sum(CAST(activated as INT)) FROM products WHERE product_type_id = p.product_type_id) as TotalActivated

未激活

sum(case when activated = 1 then 0 else 1 end) as NotActivated

(select sum(case when activated = 1 then 0 else 1 end) FROM products WHERE product_type_id = p.product_type_id) as NotActivated