Mysql 联接查询,具有分组依据和基于列的子计数

Mysql 联接查询,具有分组依据和基于列的子计数,mysql,sql,count,Mysql,Sql,Count,我有一个名为products的表,我的查询从中检索不同的分组行,按产品类型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 但是,这还不够,我需要一个由激活的列(布尔类型)和未激活列组成的子

我有一个名为
products
的表,我的查询从中检索不同的分组行,按产品类型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
但是,这还不够,我需要一个由
激活的
列(布尔类型)和未激活列组成的子计数

我想得到每一行,被设置为true和false的产品的子计数。我想把它们作为相关行中的另一列


有可能吗?

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

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表示真,0表示假。因此,您只需添加值即可获得计数

编辑:

如果需要单独的行,则将其包括在
分组中,并按

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;

如果需要一个计数为
已激活的独立列
,则可以使用条件聚合:

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表示真,0表示假。因此,您只需添加值即可获得计数

编辑:

如果需要单独的行,则将其包括在
分组中,并按

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;

如果使用位列类型,则可能需要将其转换为整数

我建议使用案例选择语句或子选择语句

已激活

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

未激活

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


如果使用位列类型,则可能需要将其转换为整数

我建议使用案例选择语句或子选择语句

已激活

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

未激活

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


示例数据将有助于传达您正在做的事情。@GordonLinoff嗨,我看不出它有什么帮助。。(无论如何,我现在会添加一些)样本数据将有助于传达您正在做的事情。@GordonLinoff嗨,我看不出它有什么帮助。。(我现在还是要加一些)谢谢。我不明白如何得到“未激活”,因为总和是0。。。(php中的o/c我可以计算,但是可以用SQL完成吗?)(现在我看到我只要求激活,对不起)谢谢。我不明白如何得到“未激活”,因为总和是0。。。(php中的o/c我可以计算,但可以用SQL完成吗?)(现在我看到我只要求激活的,对不起)