Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获取计数(*)并返回0_Mysql_Sql_Count - Fatal编程技术网

Mysql 如何获取计数(*)并返回0

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.

我有描述和创建日期的合格风险,这些风险附于风险子类别。最后一个风险附于风险类别,每个风险都有一个类似“风险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.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;