没有结果时添加行值-MySQL

凯伦·G

问题陈述:我需要我的结果集包含由于它们为NULL而不会自然返回的记录。

由于我的代码似乎太长,因此我将在此处放置一些简化的代码。

ScoresCompany_typeCompanyScoreProject_ID

Select Score, Count(Project_ID)
    FROM Scores
    WHERE company_type= :company_type
    GROUP BY Score

结果如下:

Score   Projects
5       95
4       94
3       215
2       51
1       155

一切正常,直到我对company_type应用了不包含5个得分类别之一中的结果的条件。发生这种情况时,我的结果集中不再有5行。

它显示如下:

Score   Projects
5       5
3       6
1       3

我希望它显示如下:

Score   Projects
5       5
4       0
3       6
2       0
1       3

我需要结果始终显示5行。(分数= 1-5)


我尝试了Spencer7593的以下方法之一。我的简化查询现在看起来像这样:

SELECT i.score AS Score,IFNULL(count(*),0)AS ProjectsFROM(选择5 AS分数UNION ALL SELECT 4 UNION ALL SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1)i LEFT JOIN在Scores.score = i上得分。得分GROUP BY得分ORDER BY i.score DESC

并给出以下结果,该结果是准确的,除了Projects中带有1的行实际上应为0,因为它们是由“ i”派生的。没有得分为5或2的项目。

Score   Projects
5       1
4       5
3       6
2       1
1       3

解决了!我只需要调整计数以专门查看项目计数-count(project)而不是count(*)。这返回了预期的结果。

spencer7593

如果您始终希望查询返回5行,其Score值为5,4,3,2,1 ...,则需要一个提供这些Score值的行源。

一种方法是使用简单的查询来返回那些固定值,例如

 SELECT 5 AS score
 UNION ALL SELECT 4
 UNION ALL SELECT 3
 UNION ALL SELECT 2
 UNION ALL SELECT 1

然后将该查询用作内联视图,并对当前查询的结果执行外部联接操作

 SELECT i.score                AS `Score`
      , IFNULL(q.projects,0)   AS `Projects`
   FROM ( SELECT 5 AS score
          UNION ALL SELECT 4
          UNION ALL SELECT 3
          UNION ALL SELECT 2
          UNION ALL SELECT 1
        ) i
   LEFT
   JOIN (
          -- the current query with "missing" Score rows goes here
          -- for completeness of this example, without the query 
          -- we emulate that result with a different query
          SELECT 5 AS score, 95 AS projects
          UNION ALL SELECT 3, 215
          UNION ALL SELECT 1, 155
        ) q
     ON q.score = i.score
  ORDER BY i.score DESC

在此示例中,它不一定是视图查询。但是确实需要有一个行源,可以从中返回行。例如,您可以有一个简单的表,其中包含那五个行以及那五个得分值。

这只是一般方法的示例方法。可能可以修改现有查询以返回所需的行。但是,如果看不到查询,模式和示例数据,我们就无法分辨。


跟进

根据对问题的编辑,显示当前查询的示例。

如果我们保证的五个值Score将始终出现在Scores表中,则可以进行条件聚合,编写如下查询:

 SELECT s.score
      , COUNT(IF(s.company_type = :company_type,s.project_id,NULL)) AS projects
  FROM Scores s
 GROUP BY s.score
 ORDER BY s.score DESC

请注意,这将需要对所有行进行扫描,因此它的效果可能不尽人意。“技巧”是IF函数,当该行将被WHERE子句排除时,它将返回NULL值代替project_id。)

如果保证project_id非NULL,则可以使用更简洁的MySQL速记表达式来实现等效结果...

      , IFNULL(SUM(s.company_type = :company_type),0) AS projects

1是可行的,因为当比较为TRUE时MySQL返回,否则返回0或NULL。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章