问题陈述:我需要我的结果集包含由于它们为NULL而不会自然返回的记录。
由于我的代码似乎太长,因此我将在此处放置一些简化的代码。
表Scores
有Company_type
,Company
,Score
,Project_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 Projects
FROM(选择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(*)。这返回了预期的结果。
如果您始终希望查询返回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] 删除。
我来说两句