Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.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
Php MySQL-计算日期范围内的行出现次数,但将null转换为0,以便显示_Php_Mysql_Count_Ifnull - Fatal编程技术网

Php MySQL-计算日期范围内的行出现次数,但将null转换为0,以便显示

Php MySQL-计算日期范围内的行出现次数,但将null转换为0,以便显示,php,mysql,count,ifnull,Php,Mysql,Count,Ifnull,这是我目前的问题 SELECT DAYNAME(date_created) AS Day, COUNT(*) AS my_count FROM sometable WHERE (@date_created >= '2010-10-20 21:02:38' OR @date_created IS NULL) AND (@date_created <= '2010-10-27 21:02:38' OR @date_created IS NULL) GROUP BY DAY(dat

这是我目前的问题

SELECT DAYNAME(date_created) AS Day, 
COUNT(*) AS my_count FROM sometable 
WHERE (@date_created >= '2010-10-20 21:02:38' OR @date_created IS NULL) 
AND (@date_created <= '2010-10-27 21:02:38' OR @date_created IS NULL) 
GROUP BY DAY(date_created)
选择DAYNAME(创建日期)作为日期,
将(*)作为我的_从某个表中计数
其中(@date\u created>='2010-10-20 21:02:38'或@date\u created为空)

而且(@date_created
MySQL
缺少在运行时生成记录集的方法(如
PostgreSQL
中的
generate_series

执行此查询的唯一方法是保留一个包含所有可能日期的表(或者,更好的是,一个较小的表,您可以与其自身交叉连接):

然后,您可以生成所有可能日期的列表,并将表与其左键联接:

SLEECT  '2010-01-01' + INTERVAL 10000 * a1.a + 100 * a2.a + a3.a DAY AS dt,
        COUNT(date_created)
FROM    a a1
CROSS JOIN
        a a2
CROSS JOIN
        a a3
LEFT JOIN
        sometable
ON      date_created = '2010-01-01' + INTERVAL 10000 * a1.a + 100 * a2.a + a3.a DAY
WHERE   (a1.a, a2.a, a3.a) <= (0, 3, 65)
GROUP BY
        dt
SLEECT'2010-01-01'+间隔10000*a1.a+100*a2.a+a3.一天作为dt,
计数(创建日期)
从a1
交叉连接
a2
交叉连接
a3
左连接
有点
创建日期='2010-01-01'+间隔10000*a1.a+100*a2.a+a3.天

其中(a1.a,a2.a,a3.a)欢迎Doug!我在本地运行了一个修改后的SQL版本,即使是那些空日期,我也会得到结果。首先,要实时将空值转换为其他值(“将空值转换为0”)您需要使用MySQL语句,如果您了解Oracle,它非常类似于
DECODE
命令。空值会自动计算为false,因此您可以简单地编写:

SELECT IF(date_created,date_created,0) FROM sometable
当然…0不再是日期,而NULL是。我发现
DAYNAME
函数只是传递空日期供您处理:

SELECT DAYNAME(date_created) day,COUNT(*) my_count 
FROM sometable
WHERE date_created IS NULL OR
 (date_created>='2010-10-20 21:02:38' AND date_created <= '2010-10-27 21:02:38')
GROUP BY DAY(date_created)

@sign描述了一个用户变量-您是否正在从sometable中提取创建的日期?如果是,请从变量中删除@sign

不确定如果创建的日期为空,为什么要包含它。也许一些示例行和所需的输出有助于准确说明您要查找的内容。祝您好运!:)

使用合并:

从表中选择COALESCE(x,0)作为val


如果x为null,它将返回0

在使用@

时保持一致我确信这是一个好的解决方案,但目前这有点超出我的理解。您是否可以没有一个值为0-99的表,并在查询中引入3个别名?还是MySQL不支持表别名?@Damien:可以。这只是对实际解决方案的重写,使用了
(如果没有
允许无效日期
,这将无法工作)。很好的观点。嗯,你是说这是不可能的。。。。我可能需要用php做一些时髦的事情来填补空白。我想在某种程度上,我是在要求mysql发明数据。。。这并不是获取和操作的一部分。。。是吗?通过IF语句,您可以告诉MySQL使用什么数据,而不是null
从sometable
中选择IF(date\u created,date\u created,now()),这有点像创建。这不是不可能的,但是根据你给出的例子,我不明白你为什么要这样做-如果没有
date\u created
你怎么能把它算作是在一周中的某一天创建的?{不管你在哪一天运行这个语句,上面的结果都会使你的数字出现偏差。}正如你所说的,你也可以使用PHP来找出如何处理这些空值。基本上,我显示的是每天显示印象的统计数据。目前,只要有数据,它看起来和工作都很好。但如果有一天没有任何印象,它就会一起跳过。
SELECT IF(date_created,date_created,0) FROM sometable
SELECT DAYNAME(date_created) day,COUNT(*) my_count 
FROM sometable
WHERE date_created IS NULL OR
 (date_created>='2010-10-20 21:02:38' AND date_created <= '2010-10-27 21:02:38')
GROUP BY DAY(date_created)
//You may not even need "date_created IS NULL OR" in the where statement
$sql="SELECT DAYNAME(date_created) day,COUNT(*) my_count 
    FROM sometable
    WHERE date_created IS NULL OR
     (date_created>='2010-10-20 21:02:38' 
      AND date_created <= '2010-10-27 21:02:38')
    GROUP BY DAY(date_created)";
//We're assuming you've setup a MySQL connection in $conn
$result = @mysql_query($sql, $conn) or die(mysql_error());

//Starting data - Zero for every day
$days=array("Sunday"=>0,"Monday"=>0,"Tuesday"=>0,"Wednesday"=>0,
   "Thursday"=>0,"Friday"=>0,"Saturday"=>0);
while($row = mysql_fetch_array($result)) {
   $days[$row["day"]]+=$row["my_count"];
}
mysql_free_result($result);

//Preview the output
print_r($days);