Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
Mysql 根据日期对行进行计数/分组,包括缺少_Mysql_Sql - Fatal编程技术网

Mysql 根据日期对行进行计数/分组,包括缺少

Mysql 根据日期对行进行计数/分组,包括缺少,mysql,sql,Mysql,Sql,我的数据库中有一堆表示订单的行,即 id | date --------------------- 1 | 2013-09-01 2 | 2013-09-01 3 | 2013-09-02 4 | 2013-09-04 5 | 2013-09-04 我希望显示每天的行数,包括缺少的天数,因此输出为: 2013-09-01 | 2 2013-09-02 | 1 2013-09-03 | 0 2013-09-04 | 2 我见过有两个表的例子,一个有记录,另一个有日期,但我理想情况下希

我的数据库中有一堆表示订单的行,即

id | date
---------------------
1  | 2013-09-01
2  | 2013-09-01
3  | 2013-09-02
4  | 2013-09-04
5  | 2013-09-04
我希望显示每天的行数,包括缺少的天数,因此输出为:

2013-09-01 | 2
2013-09-02 | 1
2013-09-03 | 0
2013-09-04 | 2
我见过有两个表的例子,一个有记录,另一个有日期,但我理想情况下希望有一个单独的表

我目前可以找到有记录的行,但不能找到没有记录的天数

有人知道怎么做吗


谢谢

试试这样的东西

SELECT 
  c1,  
  GROUP_CONCAT(c2 ORDER BY c2) AS 'C2 values' 
FROM table 
GROUP BY c1; 
要检索在另一列c2中存在特定值的c1值列表,您需要在中指定c2值的
子句和指定列表中不同项目所需数量的
HAVING
子句

SELECT c1  
FROM table 
WHERE c2 IN (1,2,3,4) 
GROUP BY c1 
HAVING COUNT(DISTINCT c2)=4; 
有关此相关问题的更多帮助


如果要获取过去7天的数据,可以通过
UNION
生成伪表,如:

SELECT 
  COUNT(t.id), 
  fixed_days.fixed_date 
FROM t 
  RIGHT JOIN 
  (SELECT CURDATE() as fixed_date 
   UNION ALL SELECT CURDATE() - INTERVAL 1 day 
   UNION ALL SELECT CURDATE() - INTERVAL 2 day 
   UNION ALL SELECT CURDATE() - INTERVAL 3 day 
   UNION ALL SELECT CURDATE() - INTERVAL 4 day 
   UNION ALL SELECT CURDATE() - INTERVAL 5 day 
   UNION ALL SELECT CURDATE() - INTERVAL 6 day) AS fixed_days 
  ON t.`date` = `fixed_days`.`fixed_date`
GROUP BY 
  `fixed_days`.`fixed_date`
-看这个。请注意,如果您的字段是
DATETIME
date类型,则需要首先应用
date()

SELECT 
  COUNT(t.id), 
  fixed_days.fixed_date 
FROM t 
  RIGHT JOIN 
  (SELECT CURDATE() as fixed_date 
   UNION ALL SELECT CURDATE() - INTERVAL 1 day 
   UNION ALL SELECT CURDATE() - INTERVAL 2 day 
   UNION ALL SELECT CURDATE() - INTERVAL 3 day 
   UNION ALL SELECT CURDATE() - INTERVAL 4 day 
   UNION ALL SELECT CURDATE() - INTERVAL 5 day 
   UNION ALL SELECT CURDATE() - INTERVAL 6 day) AS fixed_days 
  ON DATE(t.`date`) = `fixed_days`.`fixed_date`
GROUP BY 
  `fixed_days`.`fixed_date`

使用以下存储过程,它将允许您获得7天以上的结果,只需传递所需的天数即可

DELIMITER $$

CREATE DEFINER=`server`@`%` PROCEDURE `test`(d INT)
BEGIN

    CREATE TEMPORARY TABLE dates 
    (
      f_day DATETIME
    );

    WHILE d > 0 DO
        INSERT INTO dates SELECT DATE(NOW())-d;
        SET d = d - 1;
    END WHILE;

    SELECT 
        IF(isnull(`id`),0,`id`), 
        `fixed_days`.`f_day`
    FROM t 
    RIGHT JOIN 
        dates AS `fixed_days` 
        ON t.`date` = `fixed_days`.`f_day`
    GROUP BY 
    `fixed_days`.`f_day`;

    DROP TABLE dates;
END

如果您的日期范围不受限制,唯一好的选择是有两个表(一个有日期)因为MySQL不支持序列。它将被限制为最好显示最近7天内的订单。重复:无论日期范围中是否没有行,都会为每行返回
1
,如果字段是
datetime
?更改SQL是否容易?