加入日历表

时间:2018-05-02 14:27:45

标签: mysql sql join

我有一个包含信息和日期的表,其中包含一些缺失的表,因此我希望将该表与日历表一起填充缺失日期,并将同一行中另一列中的值设置为null。这是一个例子:

Steps | Date
 10   | 2018-04-30
 20   | 2018-04-28

它想要做以下事情:

Steps | Date
 10   | 2018-04-30
 null | 2018-04-29
 20   | 2018-04-28

这就是我的尝试(真正的查询,所以你可以指出我做错了什么):

SELECT sum(steps), date(from_unixtime(u.in_date)) as stepdate
    FROM userdata u
        RIGHT JOIN
    time_dimension td
    ON date(from_unixtime(u.in_date)) = td.db_date
    AND user_id = 8
    GROUP BY day(from_unixtime(in_date))
    ORDER BY stepdate DESC;

我希望这个查询能够做我想做的事,但事实并非如此。表格time_dimension及其列db_date包含所有日期(2017-01-01至2030-01-01),这是我尝试加入的{{1} }' s userdata列(位于unix_time中)。

编辑:我在SO中检查了以下问题:

编辑,关于副本:特别是这个问题是使用interval和date_add来比较它们的表。我正在使用日历表来加入它们。虽然相似,但我认为他们不会有同样的解决方案。

解决方案:感谢xQBert,他指出了错误:

  

问题:将组放在userdata表和select上,你基本上忽略了时间维度数据。 Userdata中没有2018-4-29日期(对于用户8)修复选择&分组来源于时间维度数据并解决了问题。

因此,我将in_date更改为GROUP BY day(from_unixtime(in_date))

1 个答案:

答案 0 :(得分:0)

您需要left join而不是right join,或者您也可以更改表的位置

SELECT sum(steps), date(from_unixtime(td.db_date)) as stepdate
FROM time_dimension td  
LEFT JOIN userdata u
     ON date(from_unixtime(u.in_date)) = td.db_date 
WHERE user_id = 8
GROUP BY date(from_unixtime(td.db_date))
ORDER BY stepdate DESC;

但是,这假设time_dimension表被视为日历表。