问题
我有一个logs表,用户可以在其中输入他们在一个项目上花费的时间(它用于应用程序上的图形和数据表)。我还生成了一个“日历”表,这样我就可以留下连接日期,并用零填充“空”日期。然而,在花了一段时间后,我找不到一个方法去做。。。
表1:日志
id | hoursSpent | logDate
1 5 2018-08-05
2 1 2018-08-07
3 3 2018-08-10
表2:日历
id | db_date
20180807 2018-08-07
20180808 2018-08-08
20180809 2018-08-09
201808010 2018-08-10
etc...
期望输出
db_date | hoursSpent
2018-08-05 5
2018-08-06 0
2018-08-07 1
2018-08-08 0
2018-08-09 0
2018-08-10 3
到目前为止使用的代码(完全不起作用…)
SELECT hoursSpent, db_date
FROM logs LEFT JOIN calendar ON db_date
WHERE db_date BETWEEN '2018-08-10' AND '2018-08-01'
GROUP BY db_date
3条答案
按热度按时间46qrfjad1#
使用
LEFT JOIN
是正确的。查询的其余部分需要清理:笔记:
你想要所有的行吗
calendar
,所以它应该是LEFT JOIN
.你需要有效的
ON
连接两个表的条件。BETWEEN
要求操作数按顺序排列,因此小操作数在AND
后面越大。GROUP BY
似乎没必要。COALESCE()
实际上产生了0
价值观。在具有多个表引用的查询中,限定所有列名。
b91juud32#
包含所有必需行的表(
Calendar
)必须在LEFT JOIN
,缺少记录的表(Logs
)在右边。或者,您可以保持表的顺序,而不是使用RIGHT JOIN
.当查询中有多个表时,使用别名消除歧义非常有用。
完整的
ON
子句需要比较。指定的范围
BETWEEN
条件必须按升序排列。这个
GROUP BY
子句要求将聚合函数应用于SELECT
-列表。在这里SUM
功能合适。自从SUM
函数返回NULL
如果没有匹配的记录,我们应用COALESCE
函数将它们转换为0
s。请参见sql fiddle:http://sqlfiddle.com/#!9/d28de9c/3/0型
1hdlvixo3#
你的加入顺序不对,
calendar
应位于左侧,因为应包括其所有行,而不考虑来自的匹配行logs
. 转变NULL
进入0
使用coalesce()
. 如果你GROUP BY
对于日期,必须对其应用聚合函数hoursspent
. 我猜你想sum()
.这里你也可以省略
coalesce()
作为mysql的sum()
对待NULL
作为0
不管怎样。但样本数据表明,你也许不需要这么做
GROUP BY
如果同一天没有多个日志条目,也就是说。