Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL WEEK():获取日期范围内的所有周(有/无记录)_Php_Mysql_Sql_Gaps And Islands - Fatal编程技术网

Php MySQL WEEK():获取日期范围内的所有周(有/无记录)

Php MySQL WEEK():获取日期范围内的所有周(有/无记录),php,mysql,sql,gaps-and-islands,Php,Mysql,Sql,Gaps And Islands,下面是一个sql查询,我使用它来获取表中的记录数,记录数由表中存储的“仅周”日期分隔。它按预期工作 SELECT count(id), CONCAT('Week ',WEEK(complaintRaisedDate)) week FROM events WHERE categoryId=1 GROUP BY week ORDER BY week 这会产生类似的结果 count(id) week ---------- | ---------- 1 Wee

下面是一个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查询本身来实现。可能吗?谢谢

编辑:

尝试:


假设下面有一个名为'numbers'的整数表:


@Mihai sqlfiddle补充道。目前只是半途而废的尝试。类似这样的事情?不确定我是否清楚地理解了解决方案。它收集了我不知道的所有53周的数据;我不需要。假设表中的日期范围为2013年8月1日至8月31日。所以是4周。现在,我希望只显示这4周的结果,即使其中任何一周的计数为0,但在此范围之前和之后的其他周都不显示。此外,我希望周数返回值不为空,如果可以的话,将其视为一个范围/间隔,但如果没有该周的记录,则计数仅为0。工作非常出色。非常感谢。
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);
   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;