首页 > 解决方案 > 没有结果匹配时加入表

问题描述

我为此苦苦挣扎了几个小时,但没有成功。我创建了一个包含 24 小时的表,称为 hours_table,其列小时数为 00->23,列结果全部为 0。我有一个包含呼叫持续时间的表,我试图将一天中每个时间的呼叫持续时间总和分组。

SELECT  date_format(date, '%H' ) as todayhours ,truncate(sum(duration),2) 
as result FROM OutgoingCalls a 
where date > CURDATE() group by date_format(date, '%H' )

该声明提供:

Todayhours , result
00         ,  6
02         ,  5
04         ,  1
05         ,  2
06         ,  10
07         ,  10
08         , 162 `

我想用 0 得到缺少的时间,例如:

Todayhours , result
00         ,  6
01         ,  0
02         ,  5
03         ,  0
04         ,  1
05         ,  2
06         ,  10
07         ,  10
08         , 162 

hours_table 看起来像:

hours       result
00          0
01          0
02          0
...
23          0

我有这个 SQL:

SELECT  date_format(date, '%H' ) as todayhours ,truncate(sum(duration),2) 
as result FROM OutgoingCalls a
LEFT JOIN hours_table h ON h.hours = date_format(date, '%H' )
where date > CURDATE() group by h.hours

无论我从右到左加入什么更改,我都只能从 OutgoingCalls 选择中找到时间(第一个没有加入)。

当 OutgoingCalls 的结果在特定时间没有结果时,我希望得到所有 24 小时。

标签: mysqljoin

解决方案


您应该翻转外部联接。主表应该hours_table代替OutgoingCalls,如下所示:

SELECT
  h.hours,
  date_format(date, '%H' ) as todayhours,
  truncate(sum(duration),2) as result
FROM hours_table h
LEFT JOIN OutgoingCalls a ON h.hours = date_format(date, '%H' )
WHERE date > CURDATE()
GROUP BY h.hours

推荐阅读