Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 SQL查询_Mysql_Sql_Database - Fatal编程技术网

MySQL SQL查询

MySQL SQL查询,mysql,sql,database,Mysql,Sql,Database,我正在尝试创建一个查询,该查询将检查过去7天我的数据库中有多少条记录,它可以工作,但它只返回记录存在的日期。我希望它在没有数据的情况下返回0,因为我正在生成7天报告 感谢您的帮助 SELECT DATE(created_date) AS date, (SELECT COUNT(id) FROM records WHERE DATE(created_date) = date AND method = 'tw') AS total_records FROM recor

我正在尝试创建一个查询,该查询将检查过去7天我的数据库中有多少条记录,它可以工作,但它只返回记录存在的日期。我希望它在没有数据的情况下返回0,因为我正在生成7天报告

感谢您的帮助

SELECT DATE(created_date) AS date, 
    (SELECT COUNT(id) 
    FROM records 
    WHERE DATE(created_date) = date AND method = 'tw') AS total_records 
FROM records 
WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day) 
GROUP BY date

方法上的索引created\u date将有助于提高效率。

我怀疑将子查询从SELECT子句移动到from子句将提高性能。但是,如果只想计算tw记录,则根本不需要子查询:

SELECT date(created_date) as date, 
       sum(case when method = 'tw' then 1 else 0 end) as total_records
FROM records 
WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
group by date(created_date)

假设每天至少有一种类型的记录,则每天都会返回。顺便说一句,如果您对created_date为NULL有问题,那么您可以包括Juergen建议的条件。

性能将取决于您在7天间隔内拥有的记录数

select date, 
       sum(cnt) 
from (SELECT 
       count(id) as cnt, 
       date(created_date) as date
       FROM records 
      WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
            and method ='tw' 
            and created_date < now()
      group by date
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 6 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 5 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 4 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 3 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 2 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 1 day)) as date)
      union all (select 0 as cnt, date(NOW()) as date)
     ) t

group by date

非常感谢,这个查询很有效,但是看起来很慢,可能是我自己最初的尝试太差了!在一个有50k条记录的数据库上大约需要10秒钟你有关于创建日期的索引吗?此查询需要一个。DATEcreated\u日期可能会使索引对该部分无效。好资源:您好,这种方法对MyISAM有效,但对InnoDB无效-是因为选择了0吗?现在,每天在新的sql引擎上返回0。Thanks@Jon选择0用于添加总和为0的行,前提是该表没有当天的记录。我不知道mysql引擎会如何影响这个查询。
SELECT date(created_date) as date, 
       sum(case when method = 'tw' then 1 else 0 end) as total_records
FROM records 
WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
group by date(created_date)
select date, 
       sum(cnt) 
from (SELECT 
       count(id) as cnt, 
       date(created_date) as date
       FROM records 
      WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
            and method ='tw' 
            and created_date < now()
      group by date
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 6 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 5 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 4 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 3 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 2 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 1 day)) as date)
      union all (select 0 as cnt, date(NOW()) as date)
     ) t

group by date