我有一个名为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的产品的子计数。我想把它们作为相关行中的另一栏。
有可能吗?
答案 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