这是一个sql查询,我用来获取以星期分隔的表中的记录计数(只有日期存储在表中)。它按预期工作。
SELECT count(id), CONCAT('Week ',WEEK(complaintRaisedDate)) week
FROM events
WHERE categoryId=1
GROUP BY week
ORDER BY week
这会产生类似
的结果count(id) week
---------- | ----------
1 Week 36
2 Week 40
1 Week 41
我希望结果如下:
count(id) week
---------- | ----------
1 Week 36
0 Week 37
0 Week 38
0 Week 39
2 Week 40
1 Week 41
也就是说,如果没有找到特定周的记录,它仍然应该显示一周(在表中记录的日期范围内),计数为0.我可以找到一种在PHP中执行此操作的方法,但是我想知道是否可以通过稍微调整SQL查询本身来实现它。可能吗?感谢。
修改:SQLFiddle
答案 0 :(得分:2)
假设你有一个整数表(下面称为`numbers`
):
SELECT COALESCE(n, 0) AS num_complaints, CONCAT('Week ', i) AS `week`
FROM (SELECT i
FROM numbers
WHERE i BETWEEN (SELECT WEEK(MIN(complaintRaisedDate)) FROM events LIMIT 1)
AND
(SELECT WEEK(MAX(complaintRaisedDate)) FROM events LIMIT 1))
week_ranges
LEFT JOIN ( SELECT count(id) AS n, WEEK(complaintRaisedDate) AS weeknum
FROM events
WHERE categoryId=1
GROUP BY weeknum) weekly_tallies
ON week_ranges.i = weekly_tallies.weeknum
ORDER BY `week` ASC;
答案 1 :(得分:1)
尝试:http://sqlfiddle.com/#!2/5dfbf/36
CREATE TABLE weeks (
id INT
);
INSERT INTO weeks (id) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54);
SELECT count(events.id), ifnull(CONCAT('Week ',WEEK(complaintRaisedDate)),0) week
FROM events RIGHT OUTER JOIN weeks ON WEEK(events.complaintRaisedDate) = weeks.id
GROUP BY weeks.id
HAVING weeks.id>=(SELECT MIN(WEEK(events.complaintRaisedDate)) FROM events)
AND weeks.id<=(SELECT MAX(WEEK(events.complaintRaisedDate)) FROM events);