4

这是我当前的查询

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,但没有运气

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

任何帮助将不胜感激

4

5 回答 5

1

使用 COALESCE :

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

如果 x 为空,它将返回 0

于 2010-11-02T07:34:24.943 回答
0

欢迎道格!我在本地运行了您的 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 天 + NULL(有计数)。这有点道理......你不能将未知日期转换为一周中的某一天。

@除非我误解了您的目的,否则这可能是您在 SQL 中的错误标志。

更新

根据您的最后评论,您需要接管 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);
于 2010-10-27T13:51:09.307 回答
0

使用@时保持一致

于 2010-12-09T13:40:19.970 回答
0

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

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

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 条记录”。

于 2010-10-27T12:03:25.190 回答
0

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

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

于 2010-10-30T11:04:35.297 回答