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_createdMySQL
缺少在运行时生成记录集的方法(如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);