检索行数并在没有行时返回 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返回固定数目的记录