Mysql IFNULL 在多个 SELECT 查询中只工作一次
Mysql IFNULL working only once in a multiple SELECT query
我正在尝试使用 MySQL 查询构建月份图形。我正在使用 UNION 命令检查单个查询中每个月的 table 中有多少行。以下为 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 给我 return 一个“0”,以防那个月没有行(一月份就是这种情况)。
那个查询总共有12个SELECTS(我只复制了3个保存space),每个月一个。有些月份会 return 一个值,有些则不会(然后 IFNULL 应该将其转换为“0”)。
对于所有 12 个月,我的最终输出应该如下所示:
// OUTPUT: 0,176,68,0,0,0,0,0,12,15,176,43,
但是...如果有多个 SELECT return 没有行,则查询不会向结果添加另一个“0”。我的最终结果是这样的:
// OUTPUT: 0,176,68,12,15,176,43,
好像IFNULL只执行了一次,即使他出现在所有12个SELECTS...
我是不是做错了什么?谁能发现我的代码中的错误或其他错误?
谢谢!
使用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
returns 仅 DISTINCT
行。
来自doc:
The default behavior for UNION is that duplicate rows are removed from
the result.
我正在尝试使用 MySQL 查询构建月份图形。我正在使用 UNION 命令检查单个查询中每个月的 table 中有多少行。以下为 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 给我 return 一个“0”,以防那个月没有行(一月份就是这种情况)。
那个查询总共有12个SELECTS(我只复制了3个保存space),每个月一个。有些月份会 return 一个值,有些则不会(然后 IFNULL 应该将其转换为“0”)。 对于所有 12 个月,我的最终输出应该如下所示:
// OUTPUT: 0,176,68,0,0,0,0,0,12,15,176,43,
但是...如果有多个 SELECT return 没有行,则查询不会向结果添加另一个“0”。我的最终结果是这样的:
// OUTPUT: 0,176,68,12,15,176,43,
好像IFNULL只执行了一次,即使他出现在所有12个SELECTS...
我是不是做错了什么?谁能发现我的代码中的错误或其他错误?
谢谢!
使用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
returns 仅 DISTINCT
行。
来自doc:
The default behavior for UNION is that duplicate rows are removed from the result.