我正在尝试编写单个查询,以便在一个日期范围内检索多个用户的时间信息。
我的表格设置如下:
项:
user_id | entry_date | entry_hours
1 | 2013-11-12 | 4
1 | 2013-11-12 | 5
1 | 2013-11-13 | 3
2 | 2013-11-13 | 7
....
日历:
calendar_date
.....
2013-11-10
2013-11-11
2013-11-12
2013-11-13
2013-11-14
.....
如果我运行此查询:
SELECT *, e.user_id, e.entry_date, COALESCE(SUM(e.entry_hours), 0) as total
FROM `entry` e
WHERE entry_date BETWEEN '2013-11-12' and '2013-11-13'
GROUP BY e.user_id, e.entry_date
我得到的是
的效果user_id | entry_date | total
1 | 2013-11-12 | 9
1 | 2013-11-13 | 3
2 | 2013-11-13 | 7
当我想要这样的时候:
user_id | entry_date | total
1 | 2013-11-12 | 9
1 | 2013-11-13 | 3
2 | 2013-11-12 | 0
2 | 2013-11-13 | 7
使用0填写缺失日期。
编辑:当他们没有列出的条目时,我还需要用0来引入user_id。假设我包含在WHERE
条AND user_id IN (1,2,3)
中,我会得到类似的结果:
user_id | entry_date | total
1 | 2013-11-12 | 9
1 | 2013-11-13 | 3
2 | 2013-11-12 | 0
2 | 2013-11-13 | 7
3 | 2013-11-12 | 0
3 | 2013-11-13 | 0
日历表背后的想法是能够拉出范围内的所有日期并将它们与条目表连接以填写缺少的日期,但我一直无法弄清楚如何执行此操作。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
SELECT
u.user_id,
c.calendar_date,
COALESCE(SUM(e.entry_hours), 0)
FROM calendar c
CROSS JOIN users u
LEFT JOIN entry e
ON (c.calendar_date = e.entry_date AND u.user_id = e.user_id)
GROUP BY u.user_id,c.calendar_date
答案 1 :(得分:0)
这是你在找什么? Mysql show everyday between even if there are no results
我这样做的方法是拥有一张日历表。