Mysql IFNULL只在多个SELECT查询中工作一次

时间:2015-09-14 17:50:06

标签: php mysql union ifnull

我正在尝试使用MySQL查询构建月图形。我正在使用UNION命令检查单个查询中每个月的表中有多少行。下面3个月的例子:

$query =
"SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 1), 0) AS total UNION
 SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 2), 0) AS total UNION
 SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 3), 0) AS total";

$stats_query = mysqli_query ($db_connection, $query);

  $result = "";
  while ($row = mysqli_fetch_assoc($stats_query)) {
    $result .= $row['total'].",";
  }
  echo ($result);

// OUTPUT: 0,176,68,

正如你所看到的,我告诉mysql在那个月没有行的情况下给我一个“0”(1月就是这种情况)。

该查询总共有12个SELECTS(我只复制了3个以节省空间),每个月一个。有些月份会返回一个值,有些则不会(因此IFNULL应该将其转换为“0”)。 在12个月中,我的最终输出应该如下所示:

// OUTPUT: 0,176,68,0,0,0,0,0,12,15,176,43,

但是......如果有多个SELECT不返回任何行,则查询不会向结果添加另一个“0”。我的最终结果最终是这样的:

// OUTPUT: 0,176,68,12,15,176,43,

就像IFNULL只执行一次,即使他出现在所有12个SELECTS中......

我做错了吗?任何人都可以在我的代码中发现错误吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

使用UNION ALL代替UNION获取所有结果:

 SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 1), 0) AS total UNION ALL
 SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 2), 0) AS total UNION ALL
 SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 3), 0) AS total

UNION仅返回DISTINCT行。

来自doc

  

UNION的默认行为是从中删除重复的行   结果。