0

我正在尝试使用 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”,以防该月没有行(一月份就是这种情况)。

该查询中共有 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 中......

难道我做错了什么?任何人都可以在我的代码或其他内容中发现错误吗?

谢谢!

4

1 回答 1

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行。

来自文档

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

于 2015-09-14T17:52:24.477 回答