繁体   English   中英

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

[英]MySQL - count row occurrences in a date range, but convert null to 0 so it shows

这是我目前的查询

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)

如果计数存在,它仅返回该日的数据。

我和ifnull在一起,但没有运气

我确定这是一个简单的,但我无法弄清楚!

任何帮助都会非常感激

使用COALESCE:

SELECT COALESCE(x,0)AS val FROM table;

如果x为null,则返回0

MySQL缺乏在运行时生成记录集的方法(如PostgreSQL generate_series )。

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

CREATE TABLE a (a INT PRIMARY KEY);

INSERT
INTO    a
VALUES
        (0),
        (1),
        …
        (99)

然后,您可以生成所有可能日期的列表,并使用它连接您的表:

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

这个条件:

(a1.a, a2.a, a3.a) <= (0, 3, 65)

意思是“拍摄365条记录”。

欢迎道格! 我在本地运行了SQL的修改版本,即使是那些NULL日期我也得到了结果。 首先要做的是 - 要实时将null转换为其他值(“将null转换为0”),您需要使用MySQL语句IF ,如果您对Oracle有所了解,那就像DECODE命令一样。 NULL值自动计算为false,因此您只需编写:

SELECT IF(date_created,date_created,0) FROM sometable

当然...... 0不再是日期,那么NULL就是。 我发现DAYNAME函数只是传递NULL日期,你可以处理:

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)

什么我得到了那(带有示例数据集)是8个值day :7天周+空的(用计数)。 哪种方式有意义......您无法将未知日期转换为一周中的某一天。

它可能是你的SQL中的错误@符号,除非我误解你的目的。

UPDATE

根据您的上一条评论,您需要接管PHP中的处理。 事先构建days数组,然后将MySQL数据添加到现有数组中,以便所有日期都存在(并按顺序)。

来源PHP中的日计算

//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);

@符号描述了一个用户变量 - 你是否从某个表中提取date_created? 如果是这样,请从变量中删除@符号。

不确定为什么要包含date_created,如果它为null。 也许一些示例行和所需的输出将有助于说明您正在寻找的内容。 祝好运! :)

使用@时保持一致

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM