【问题标题】:MySQL - Select with COUNT returning a NULL rowMySQL - 使用 COUNT 选择返回 NULL 行
【发布时间】:2012-05-31 09:18:11
【问题描述】:

这行得通

SELECT DISTINCT  b.b_id 
FROM             b INNER JOIN c 
ON               b.b_id=c.b_id  
WHERE            c.active='yes' AND b.featured='no'

当结果应该返回 0 行时,这将返回一个 null 行,其中 count = 0

SELECT DISTINCT  b.b_id, COUNT(c.c_id) AS count
FROM             b INNER JOIN c 
ON               b.b_id=c.b_id  
WHERE            c.active='yes' AND b.featured='no'

我做错了吗?

【问题讨论】:

  • 当您使用聚合函数 (COUNT) 时,您需要 GROUP BY 非聚合列。 MySQL 甚至不应该允许该查询,但它确实会导致不可预知的行为......
  • 啊,好的,所以我删除了 DISTINCT 并在查询末尾附加了 b.b_id 的 GROUP。对吗?

标签: mysql


【解决方案1】:

我想尝试使用 GROUP BY 而不是 DISTINCT。

    SELECT b.b_id, COUNT(c.c_id) AS count
    FROM 
    b INNER JOIN c 
    ON 
    b.b_id=c.b_id  
    WHERE 
    c.active='yes' 
    AND 
    b.featured='no'
    GROUP BY b.b_id

【讨论】:

    【解决方案2】:

    尝试将DISTINCT 放入 COUNT():

    SELECT b.b_id, COUNT(DISTINCT c.c_id) AS count
    FROM b
    JOIN c ON b.b_id=c.b_id  
    WHERE c.active='yes' 
    AND b.featured='no'
    GROUP BY 1
    

    顺便说一句,请考虑像这样格式化您的 SQL,恕我直言,这样更具可读性。

    【讨论】:

      【解决方案3】:

      我认为您想要 left join 而不是 inner join,因为当给定的 b 记录没有匹配的 c 记录时,您希望返回计数 0 而不是丢失的行。

      此外,您应该在使用聚合函数时包含group by,例如count

      SELECT
          b.b_id,
          COUNT(DISTINCT c.c_id) AS count
      FROM 
          b 
          LEFT JOIN c 
              ON b.b_id=c.b_id  
              AND c.active='yes' 
      WHERE b.featured='no'
      GROUP BY b.b_id
      

      【讨论】:

      • “group by”子句可以返回 NULL 值,谢谢
      猜你喜欢
      • 2012-04-04
      • 2015-07-09
      • 1970-01-01
      • 2014-09-08
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多