【问题标题】:Selecting from one MySQL table, return count(id) even if count is 0从一个 MySQL 表中选择,即使 count 为 0,也返回 count(id)
【发布时间】:2013-03-20 09:40:23
【问题描述】:

我一直在谷歌搜索这个问题的答案,我确信它比我做的更容易,我想学习正确的方法。

我有一个表emails_sent,我从中选择计数并按列分组。每行有 3 个type 之一 - “确认”、“1 天”和“同一天”。我也在某个日期之前这样做。假设,这是我今天选择的示例查询:

SELECT Count(id) AS count, 
       type 
FROM   emails_sent 
WHERE  Date_format(date, '%Y-%m-%d') = '2013-03-29' 
GROUP  BY type 
ORDER  BY type; 

这是它返回的内容:

+--------+---------+
|计数 |类型 |
+-------+----------+
| 32 |确认 |
| 4 | 1天 |
+-------+---------+

这很好,但是今天还有第三种“类型”恰好有 0 条记录,但我需要它来提取该计数,即使它是 0。

我也尝试过创建一个只有这 3 个“类型”的第二个表,并使用右连接,但它仍然不会拉 0 计数。这就是我对这两个表所做的:

SELECT t.type, 
       Count(s.id) AS count 
FROM   emails_sent s 
       RIGHT JOIN email_types t 
               ON s.type = t.type 
WHERE  Date_format(s.date, '%Y-%m-%d') = '2013-03-29' 
GROUP  BY t.type; 

我确定我缺少的只是一些简单的东西。

【问题讨论】:

  • 无法向不存在的查询添加行。 SQL 方面的唯一解决方案是拥有一个包含您期望的所有值的表,并加入该表。一种解决方案可能是选择类型的所有唯一值,然后将其连接到子查询聚合函数。

标签: mysql join count group-by


【解决方案1】:

如果我正确理解了这个问题,你能不能假设如果你没有得到某种类型的记录,那是因为有 0 个条目?

【讨论】:

  • 是的,这是正确的,但我宁愿让它从我的初始查询中提取计数,而不是添加更多的 PHP 代码来解决丢失的任何电子邮件类型。我知道我可以那样做,但我觉得我还不如从一开始就以正确的方式学习它:)
  • 看看 Bailey S 的评论。您不能添加不存在的查询。您可以使用 PHP 代码来做到这一点,但您仍然需要查询所有“类型”并查看缺少哪些。有些人可能不同意,但我认为应该在 PHP 端处理报告。您可以查询您可以查询的内容,并使用脚本语言选择以此为基础生成报告。
【解决方案2】:

试试这个

SELECT t.type, 
       COALESCE( Count(s.id), 0 ) AS count 
FROM   email_types t 
       LEFT JOIN email_sent s 
               ON s.type = t.type 
WHERE  Date_format(s.date, '%Y-%m-%d') = '2013-03-29' 
GROUP  BY t.type; 

注意:我使用了LEFT JOIN,而不是1 type has many emails

【讨论】:

  • 这个查询正确地提取了数据,但仍然没有显示另一个 type 的计数为 0。
  • @ryes31 是的,它应该显示为0 没有可用的电子邮件
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多