gpt4 book ai didi

Mysql With Rollup 没有运行我预期的

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:47 25 4
gpt4 key购买 nike

这是我的例子(mysql Ver 14.14 Distrib 5.7.21,适用于 Win64 (x86_64))

DROP TABLE IF EXISTS t_tt;
CREATE TEMPORARY TABLE t_tt SELECT 1 AS tid,'team 1' AS teamName,111 AS teamData;

INSERT INTO t_tt VALUES(2,'team 2',222);
INSERT INTO t_tt VALUES(3,'team 3',333);

SELECT
tid,
isnull(tid),
IF(isnull(tid),'total',teamName) AS displayName,
SUM(teamData)
FROM t_tt GROUP BY tid WITH ROLLUP;

而且我认为结果一定是:

+-----+-------------+-------------+---------------+
| tid | isnull(tid) | displayName | SUM(teamData) |
+-----+-------------+-------------+---------------+
| 1 | 0 | team 1 | 111 |
| 2 | 0 | team 2 | 222 |
| 3 | 0 | team 3 | 333 |
| 3 | 1 | total | 666 |
+-----+-------------+-------------+---------------+

其实,真正的答案是:

+-----+-------------+-------------+---------------+
| tid | isnull(tid) | displayName | SUM(teamData) |
+-----+-------------+-------------+---------------+
| 1 | 0 | team 2 | 111 |
| 2 | 0 | team 3 | 222 |
| 3 | 0 | team 3 | 333 |
| NULL| 0 | team 3 | 666 |
+-----+-------------+-------------+---------------+

我不知道为什么显示名称的列以“team 2”开头,而不是“team 1”。

最后一行 isnull(tid) 应该等于 1,而不是 0。

最佳答案

问题是您正在使用 MySQL 扩展。您在 SELECT 中有 teamName,但它不在 GROUP BY 中。所以,MySQL 可以自由地从任何行中获取这个值。老实说,我认为它需要来自匹配的行。我不完全理解这种行为。

但是,这很容易修复。一种简单的方法是简单地添加一个聚合函数:

SELECT tid, tid is null,
COALESCE(max(teamName), 'total') AS displayName,
SUM(teamData)
FROM t_tt
GROUP BY tid WITH ROLLUP;

请注意,对于 ROLLUP 中的附加行,该值是任意的。

我还发现,如果表是用主键预先声明的,结果是固定的:

CREATE  TABLE t_tt (
tid int primary key,
teamName varchar(255),
teamData int
);

INSERT INTO t_tt VALUES(1, 'team 1', 111);
INSERT INTO t_tt VALUES(2, 'team 2', 222);
INSERT INTO t_tt VALUES(3, 'team 3', 333);

关于Mysql With Rollup 没有运行我预期的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com