如何在MYSQL select查询中进行多次计数?
我有下面的查询,我想在一行中得到这些查询返回的结果。 如下图所示:如何在MYSQL select查询中进行多次计数?,mysql,query-optimization,Mysql,Query Optimization,我有下面的查询,我想在一行中得到这些查询返回的结果。 如下图所示: SELECT count(item_id) as today FROM table1 WHERE DATE(creation_date) > DATE(NOW() - INTERVAL 1 DAY); SELECT count(item_id) as yesterday from table1 where DATE(creation_date) = DATE(NOW() - INTERVAL 1 DAY); SELE
SELECT count(item_id) as today FROM table1
WHERE DATE(creation_date) > DATE(NOW() - INTERVAL 1 DAY);
SELECT count(item_id) as yesterday from table1
where DATE(creation_date) = DATE(NOW() - INTERVAL 1 DAY);
SELECT count(item_id) year_period from table1
where creation_date > now() - interval 1 year;
我有一些方法来实现这一点,但我想一个更有效的解决方案,以实现我想要的。
我可以通过这里看到的工会来实现我想要的
----------------------------------------
|today | yesterday | one_year_period |
----------------------------------------
| 2 | 5 | 7 |
----------------------------------------
我想优化我的解决方案,使查询不会在3个不同的场合重复。使用CASE语句:
SELECT count(item_id) as today FROM table1
WHERE DATE(creation_date) > DATE(NOW() - INTERVAL 1 DAY)
union
SELECT count(item_id) as yesterday from table1
where DATE(creation_date) = DATE(NOW() - INTERVAL 1 DAY)
union
SELECT count(item_id) year_period from table1
where creation_date > now() - interval 1 year;
如果您希望提高效率,请这样做,以避免说DATEcreation_date,并使用COUNT*而不是COUNTcolumn。这样,您就可以在创建日期列上使用索引 而且,如果你有那个索引并使用我展示的那种模式,像你最初的查询会比一堆SUMCASE快得多。。。条款。为什么?因为MySQL可以通过执行所谓的
我想SUMCASE就是你要找的。使用case语句进行创建date@WEI_DBA我将尝试SUMCASE我对查询进行了修改以使用SUMCASE,并解决了我遇到的问题。DATENOW-INTERVAL 1 DAY可以简化为CURDATE-INTERVAL 1 DAY。您的案例还需要0,或者像我一样使用COUNT忽略空值
SELECT
SUM(CASE WHEN DATE(creation_date) > DATE(NOW() - INTERVAL 1 DAY) THEN 1 END) as today,
SUM(CASE WHEN DATE(creation_date) = DATE(NOW() - INTERVAL 1 DAY) THEN 1 END) AS yesterday,
SUM(CASE WHEN creation_date > now() - interval 1 year THEN 1 END) AS year_period
FROM table1
SELECT
SUM(CASE WHEN DATE(creation_date) > DATE(NOW() - INTERVAL 1 DAY) THEN 1 ELSE 0 END) today,
SUM(CASE WHEN DATE(creation_date) = DATE(NOW() - INTERVAL 1 DAY) THEN 1 ELSE 0 END) yesterday,
SUM(CASE WHEN date(creation_date) > now() - interval 1 year THEN 1 ELSE 0 END) last_year
FROM table1
SELECT count(*) as today
FROM table1
WHERE creation_date >= CURDATE()
SELECT count(*) as today FROM table1
WHERE creation_date >= CURDATE()
union
SELECT count(*) as yesterday
from table1
where creation_date >= CURDATE() - INTERVAL 1 DAY
and creation_date < CURDATE()
union
SELECT count(*) year_period from table1
where creation_date >= CURDATE() - interval 1 year;