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