检索行数并在没有行时返回 0

Posted

技术标签:

【中文标题】检索行数并在没有行时返回 0【英文标题】:Retrieving row count and returning 0 when no rows 【发布时间】:2013-07-23 08:42:52 【问题描述】:

我写了一个查询来检索我每天有多少网站注册:

SELECT created, COUNT(id)
FROM signups
GROUP BY created
ORDER BY created desc

但是,这只会检索人们实际注册的日期的行。如果一天没有人注册,我想当天返回 0。有没有办法使用 SQL 来做到这一点,还是我必须使用 php 解析结果?

【问题讨论】:

如果没有人注册,则当天没有创建记录,因此不会显示当天的计数。 正如 DevZero 所说,mysql 不可能推断出它没有的信息。您必须使用 PHP 解析它以插入计数为 0 的缺失天数。 @DevZer0,是的,这就是问题所在。我想知道是否有办法“循环”并插入值为 0 的缺失日期。看起来没有。 您忘记向表定义提供您的列的数据类型和您的 Postgres 版本。 @AgmLauncher 虽然这在 MySQL 中可能是不可能的,但在 Postgres 中是可能的。 【参考方案1】:

由于缺少信息,假设 created 的类型为 date

Postgres 提供了美妙的generate_series() 来简化此操作:

SELECT d.created, COUNT(s.id) AS ct
FROM  (
   SELECT generate_series(min(created)
                        , max(created), interval '1 day')::date AS created
   FROM   signups
   ) d
LEFT   JOIN signups s USING (created)
GROUP  BY 1
ORDER  BY 1 DESC;

这会自动从您的表中检索最小和最大天数,并在其间每天提供一行。

【讨论】:

【参考方案2】:

你可以使用NULLIF函数:

   SELECT created, NULLIF(COUNT(id), 0)
     FROM signups
 GROUP BY created
 ORDER BY created desc

文档:http://www.postgresql.org/docs/8.1/static/functions-conditional.html

【讨论】:

这行不通,因为如果signups 中没有当天的记录,则不会返回任何内容。 你在查询结果后尝试了num rows函数吗? $result = pg_query("QUERY"); pg_num_rows($result); Doc【参考方案3】:

你需要使用一个包含一系列日期的日历表并加入它

select cal.created,coalesce(total) as total from calender_table as cal left join
(
SELECT created, COUNT(id) as total
FROM signups
GROUP BY created
) as source on cal.created=source.created
ORDER BY cal.created desc

【讨论】:

【参考方案4】:

您应该在您的数据库中创建一个日历表(或在查询中生成它)并将其与您的数据库连接,然后您将获得 0 空天

SELECT calendar.c_date, COUNT(signups.id)
FROM calendar
left join signups on calendar.c_date=signups.created

GROUP BY c_date
ORDER BY c_date desc

Here is a way to make a calendar date in PostgreSQL

【讨论】:

以上是关于检索行数并在没有行时返回 0的主要内容,如果未能解决你的问题,请参考以下文章

Gravity Forms使用JS统计List中的行数并返回字段?

按小时计算行数并包含零

MySQL分页时统计总记录行数并使用limit返回固定数目的记录

NSFetchedResultsController 在向第二部分插入行时在第一部分返回错误的行数

在 MySQL 中仅检索固定数量的行

MySQL 查询在 PHP 中返回 0 行,在 phpmyadmin 中返回实际记录