Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.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
SQL PHP按天统计两个日期组之间的数据,并显示每天的记录_Php_Mysql_Sql - Fatal编程技术网

SQL PHP按天统计两个日期组之间的数据,并显示每天的记录

SQL PHP按天统计两个日期组之间的数据,并显示每天的记录,php,mysql,sql,Php,Mysql,Sql,我的sql代码有问题, 代码如下: SELECT COUNT(CASE WHEN ItemState = 1 THEN 1 ELSE NULL END) AS C1, COUNT(CASE WHEN ItemState = 3 THEN 1 ELSE NULL END) AS C2, COUNT(CASE WHEN ItemState = 5 THEN 1 ELSE NULL END) AS C3, COUNT(CASE WHEN ItemState = 7 THEN 1 ELSE NULL

我的sql代码有问题, 代码如下:

SELECT 
COUNT(CASE WHEN ItemState = 1 THEN 1 ELSE NULL END) AS C1,
COUNT(CASE WHEN ItemState = 3 THEN 1 ELSE NULL END) AS C2,
COUNT(CASE WHEN ItemState = 5 THEN 1 ELSE NULL END) AS C3,
COUNT(CASE WHEN ItemState = 7 THEN 1 ELSE NULL END) AS C4,
COUNT(CASE WHEN ItemState = 10 THEN 1 ELSE NULL END) AS C5,
DAY(LastUpdate) AS Day
FROM purchasehistory
WHERE ItemID=77
AND LastUpdate BETWEEN "2017-10-25 00:00:00" AND "2017-10-30 23:59:59"
GROUP BY Day
ORDER BY LastUpdate
LIMIT 5
count语句是有效的,但结果不是我想要的

它应该显示五个记录,其中一天等于25、26、27、28、29、30

但是当c1、c2、c3、c4和c5都等于0时,它没有显示行,而是显示所有0


如何解决这个问题?

我发现在许多情况下解决这个问题的一个简单方法是将一些过滤条件移动到case条件中:

SELECT SUM(ItemID = 77 AND ItemState = 1) AS C1,
       SUM(ItemID = 77 AND ItemState = 3) AS C2,
       SUM(ItemID = 77 AND ItemState = 5) AS C3,
       SUM(ItemID = 77 AND ItemState = 7) AS C4,
       SUM(ItemID = 77 AND ItemState = 10) AS C5,
       DAY(LastUpdate) AS Day
FROM purchasehistory
WHERE LastUpdate >= '2017-10-25' AND LastUpdate < '2017-10-31'
GROUP BY Day
ORDER BY MIN(LastUpdate)
LIMIT 5;
这假设每天至少有一种产品

更典型的解决方案是使用左连接,这在性能方面会更好。我只是觉得上面的方法是一个更快的方式,以获得预期的结果

其他一些注意事项:

MySQL将布尔表达式视为数字上下文中的数字,1表示true。你不需要箱子。 字符串分隔符的ANSI标准是单引号,而不是双引号。 使用日期时,日期逻辑更简单。无需担心最后一笔交易是在哪一天。 如果您选择了六天的数据,为什么要使用限制5?
用你正在使用的数据库来标记你的问题。那是因为在这种情况下,很可能没有返回的行,所以它不能显示任何数据。参见:鉴于你标记PHP,认真地,认真考虑处理这个问题的显示方面。