联合查询,基于列的分组依据和子计数

Joined query, with group by and sub count based on a column

我有一个名为 products 的 table,我的查询从中检索不同的分组行,按 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 列(布尔类型)和 NOT-Activated 列进行子计数。

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

可能吗?

如果你想要一个单独的列,计数为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 表示假。因此,您只需添加值即可获得计数。

编辑:

如果您想要单独的行,请将其包含在 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;

如果您使用的是 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