MySQL查询如果没有结果,返回数字“零”

5

当选择一个不存在于我的表中的日期时,它目前会返回一个空结果集。如何才能返回零而不是空结果集呢?

    SELECT SUM(TOTAL), SUM(5STAR), STORE, DATE
    FROM `table` WHERE DATE >= '2012-02-24' GROUP BY TOTAL

MySQL returned an empty result set (i.e. zero rows)

我希望返回SUM(TOTAL)SUM(5STAR)的结果(如果没有行则为零)作为数字零(0)。

完整的表结构如下:

  • ID = 主键
  • DATE = 唯一约束(日期)
  • STORE
  • 5STAR
  • 4STAR
  • 3STAR
  • 2STAR
  • 1STAR
  • TOTAL
  • FROM = 唯一约束

已添加完整的表结构。也许唯一性可能会引起问题?我是新手,不确定。 - ToddN
所以如果结果集中没有行,您想返回一行带有0的数据吗?我有点困惑。 - Peter Kiss
这是正确的Peter Kiss。我正在使用PHP进行显示,如果它没有返回任何结果,则想要显示0作为总和。 - ToddN
我同意@PeterKiss的观点,你应该在PHP端处理这个逻辑,可以在某个服务或门面层实现。这种逻辑很少直接与数据库紧密相关。 - Michael Peterson
3个回答

19

尝试使用COALESCE函数。

SELECT COALESCE(SUM(TOTAL),0), COALESCE(SUM(5STAR),0), STORE, DATE
FROM `table` WHERE DATE >= '2012-02-24' GROUP BY TOTAL

8

尝试

SELECT
       IFNULL(SUM(TOTAL), 0) AS total,
       IFNULL(SUM(5STAR), 0) AS FiveStar, 
       STORE,
       DATE
FROM `table`
WHERE DATE >= '2012-02-24'
GROUP BY TOTAL

Reference


1
也可以尝试使用 COALESCE - xkeshav

0

我认为在 PHP 端处理空结果集会更容易些(计算返回的行数)。如果您想在数据库中处理它,那么您应该创建一个存储过程。

DELIMITER $$

CREATE PROCEDURE `mc`.`new_routine` (IN DT DATETIME)
BEGIN

IF EXISTS (SELECT 1 FROM `table` WHERE DATE >= @DT)
THEN
    SELECT SUM(TOTAL) AS SumTotal, SUM(5STAR) AS Sum5Star, STORE, `DATE`
    FROM `table`
    WHERE DATE >= @DT
    GROUP BY TOTAL;
ELSE
    SELECT 0 AS SumTotal, 0 AS Sum5Star, NULL AS STORE, NULL AS `DATE`;
END IF;

END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接