Mysql 如何获取计数(*)并返回0
我有描述和创建日期的合格风险,这些风险附于风险子类别。最后一个风险附于风险类别,每个风险都有一个类似“风险1”的名称,我的目标是按名称和风险类别计算过去3个月的风险数 我有此sql请求:Mysql 如何获取计数(*)并返回0,mysql,sql,count,Mysql,Sql,Count,我有描述和创建日期的合格风险,这些风险附于风险子类别。最后一个风险附于风险类别,每个风险都有一个类似“风险1”的名称,我的目标是按名称和风险类别计算过去3个月的风险数 我有此sql请求: SELECT MONTH(risk.creation_date) as month, count(*) as number, risk_category.name as risk_name FROM risk As risk JOIN risk_subcategory on risk_subcategory.
SELECT MONTH(risk.creation_date) as month, count(*) as number, risk_category.name as risk_name FROM risk As risk
JOIN risk_subcategory on risk_subcategory.id = risk.risk_subcategory_id
JOIN risk_category on risk_category.id = risk_subcategory.risk_category_id
where risk.creation_date >= (NOW()-INTERVAL 3 MONTH) GROUP BY MONTH(risk.creation_date), risk_category.name;
它将返回此结果集:
month number risk_name
---------------------------
12 1 Risk 1
12 3 Risk 2
1 1 Risk 3
1 9 Risk 2
2 1 Risk 3
2 1 Risk 1
2 10 Risk 2
我想要此结果(包括0):
我该怎么办?
感谢您从执行
计数的同一个表中选择月份,因此如果月份x的计数应为0,则表示没有月份=x的行。你不能从那张桌子上得到那个月,因为它根本不在那里
如果您想获得所有月份,您应该使用另一个有所有月份可用的表,并在该表和风险
之间执行左联接,如
select t1.month, coalesce(t2.count(*), 0)), t2.risk_name
from months t1
left join
risk t2
on t1.month = MONTH(risk.creation_date)
group by t1.month, t2.risk_name
根据投票结果,我试过这个,但不起作用:
SELECT MONTH(risk.creation_date) as month, count(*) as number, risk_category.name as risk_name FROM risk As risk
JOIN risk_subcategory on risk_subcategory.id = risk.risk_subcategory_id
JOIN risk_category on risk_category.id = risk_subcategory.risk_category_id
LEFT JOIN (
SELECT mois
FROM
(
SELECT 1 AS mois
UNION SELECT 2 AS mois
UNION SELECT 3 AS mois
UNION SELECT 4 AS mois
UNION SELECT 5 AS mois
UNION SELECT 6 AS mois
UNION SELECT 7 AS mois
UNION SELECT 8 AS mois
UNION SELECT 9 AS mois
UNION SELECT 10 AS mois
UNION SELECT 11 AS mois
UNION SELECT 12 AS mois
) as year
) as months on months.mois = MONTH(risk.creation_date)
where risk.creation_date >= (NOW()-INTERVAL 3 MONTH) GROUP BY MONTH(risk.creation_date), risk_category.name;
使用左外部联接。谢谢,但它不会更改结果集。我认为您需要使用内部联接来获得左和右组合如何获得此结果1 0风险1
?逻辑是什么?考虑包括样本DATAI具有描述和创建日期的合格风险,它们附属于风险的子类别,这些最后一类附属于风险类别,每个风险都有“风险1”的名称,我的目的是通过名称和风险类别来计算风险的数量,请在发送答案之前阅读我的问题。月份是从风险表的创建日期字段中提取的。不必粗鲁,请仔细阅读我的答案,如果不清楚,请进一步解释。我阅读了问题,并且我的答案是有效的,您不能进行查询显示表中不存在的月份。我已经提供了我的sql请求,如果有问题,请告诉它,或者为我的给定表提供另一个sql请求,当count返回NULL时,我不能接受一个应该在评论中而不是在回答中的一般答案,在我的结果中没有NULL值,我亲爱的主。在你的过去,那种对试图帮助你的人的粗鲁态度有没有收获?你之前的问题看起来很相似。为你的信念祝福你的心,但这并没有让我想用足够长的时间来写一个足够详细的答案,以便向你传达解决方案,即使我可能知道。将“左连接”更改为“右连接”以使其工作。现在您从{risk,risk_subcategory,risk_category}开始,并将其与派生表'year'连接起来。您也可以从派生表“year”开始,然后对{risk,risk_subcategory,risk_category}进行左联接。结果是,您需要在SELECT和GROUP by中将“MONTH(risk.creation_date)”替换为“MONTH.mois”,然后使用months表作为查询的基础(以不完整为借口)。
SELECT MONTH(risk.creation_date) as month, count(*) as number, risk_category.name as risk_name FROM risk As risk
JOIN risk_subcategory on risk_subcategory.id = risk.risk_subcategory_id
JOIN risk_category on risk_category.id = risk_subcategory.risk_category_id
LEFT JOIN (
SELECT mois
FROM
(
SELECT 1 AS mois
UNION SELECT 2 AS mois
UNION SELECT 3 AS mois
UNION SELECT 4 AS mois
UNION SELECT 5 AS mois
UNION SELECT 6 AS mois
UNION SELECT 7 AS mois
UNION SELECT 8 AS mois
UNION SELECT 9 AS mois
UNION SELECT 10 AS mois
UNION SELECT 11 AS mois
UNION SELECT 12 AS mois
) as year
) as months on months.mois = MONTH(risk.creation_date)
where risk.creation_date >= (NOW()-INTERVAL 3 MONTH) GROUP BY MONTH(risk.creation_date), risk_category.name;