我正在尝试使用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中......
我做错了吗?任何人都可以在我的代码中发现错误吗?
谢谢!
答案 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的默认行为是从中删除重复的行 结果。