Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 select查询中进行多次计数?_Mysql_Query Optimization - Fatal编程技术网

如何在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;