Mysql 停止查询跳过空值
我有一个查询,显示我的应用程序中过去14天每天的呼叫数 查询:Mysql 停止查询跳过空值,mysql,sql,null,aggregate-functions,Mysql,Sql,Null,Aggregate Functions,我有一个查询,显示我的应用程序中过去14天每天的呼叫数 查询: SELECT count(id) as count, DATE(FROM_UNIXTIME(timestamp)) as date FROM calls GROUP BY DATE(FROM_UNIXTIME(timestamp)) DESC LIMIT 14 在有0个呼叫的日期,此查询不显示这些日期。与其跳过那些日子,我希望在那个位置有一个0或NULL 有什么办法可以做到这一点吗?如果你对我的问题有任何疑问,请告诉我 感谢创建一
SELECT count(id) as count, DATE(FROM_UNIXTIME(timestamp)) as date FROM calls GROUP BY DATE(FROM_UNIXTIME(timestamp)) DESC LIMIT 14
在有0个呼叫的日期,此查询不显示这些日期。与其跳过那些日子,我希望在那个位置有一个0
或NULL
有什么办法可以做到这一点吗?如果你对我的问题有任何疑问,请告诉我
感谢创建一个表,其中包含您要确保结果中包含的每个日期的行,左外连接当前查询的结果,使用临时表的日期,上面查询的计数,如果该计数为空,则为0我不相信您的查询是“跳过
null
值”,正如标题所示。相反,您的数据可能如下所示:
id | timestamp
----+------------
1 | 2014-01-01
2 | 2014-01-02
3 | 2014-01-04
因此,没有包含缺少日期的行,因此没有要统计的行。答案是,您需要生成一个包含所有所需日期的列表,然后对其执行LEFT
或RIGHT JOIN
CREATE TABLE days_ago_list (days_ago INTEGER);
INSERT INTO days_ago_list VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13)
;
不幸的是,MySQL并不像其他数据库那样简单。似乎没有一种有效的方法来生成任何内联内容的列表。所以你需要一张桌子
我想我应该创建一个静态表,其中包含一组从当前日期中减去的整数。然后,您可以使用此表内联生成日期列表,并将其加入
CREATE TABLE days_ago_list (days_ago INTEGER);
INSERT INTO days_ago_list VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13)
;
然后:
按列出日期进行分组是非常重要的call\u date
在没有呼叫的任何日子都将NULL
。在id
上COUNT
也很重要,因为NULL
id
s将不被计数。(这可确保您在没有呼叫的情况下获得正确的0
计数。)如果需要更改列出的日期,只需更新包含整数列表的表即可
证明这一点
或者,如果这是针对web应用程序的,则可以在代码端生成日期列表,并在查询完成后将计数与日期匹配。这会使您的web应用程序逻辑变得更复杂,但也会简化查询并消除对额外表的需要。对于您的数据结构,这恐怕是不可能的,因为日期(被跳过的日期)来自表中的行。如果没有行,就没有日期。您使用的是什么数据库?SQL Server?MySQL?PostgreSQL?什么样的数据类型是timestamp
?timestamp
是INT,它是一个mySQL数据库,可能是Temp表的副本?让它成为一张永久的桌子。您可以为财务信息等添加字段。为什么要说“如果这是一个web应用程序…”?web应用程序有什么特别之处?@LoztInSpace Fine,如果你想挑剔一些不必要的东西,可以改为“如果数据库上有某种代码”。高兴吗?