对视图使用汇总会给我一个空白的字段吗?

问题描述

几天来,我一直对此表示怀疑,所以我决定创建一个示例数据集,以向我证明这并不是破坏我们的整体模式。但是不,它仍然会发生。

CREATE TABLE test_data (
    `id` int(11) NOT NULL AUTO_INCREMENT,`label` varchar(10) NOT NULL,PRIMARY KEY (`id`)
);

CREATE VIEW test_view AS
SELECT id,label 
FROM test_data;


INSERT INTO test_data VALUES
(1,'red'),(2,(3,(4,(5,'green'),(6,(7,(8,'yellow'),(9,(10,(11,'blue'),(12,(13,(14,(15,(16,'blue');

https://www.db-fiddle.com/f/vMwvXDtReEwfAtGjYw4xEt/0

所以我们有一个包含一些数据的表,然后我们使用汇总的分组方式来选择它:

SELECT label,COUNT(id) as cnt FROM test_data GROUP BY label WITH ROLLUP

然后有一个与此相关的查询(在现实世界中它还会做其他事情,在这个示例中只是从选择中提取数据)。

SELECT COALESCE(label,'TOTAL') as wrap_label,label,cnt FROM
(
    SELECT label,COUNT(id) as cnt FROM test_data GROUP BY label WITH ROLLUP
) as d;

当我直接从表中提取数据时,它工作得很好,我们得到了以TOTAL作为wrap_label的最后一行。但是,如果涉及到一个视图(本质上是test_data中的SELECT *),它将停止拉出wrap_label:

SELECT COALESCE(label,COUNT(id) as cnt FROM test_view GROUP BY label WITH ROLLUP
) as d;

如果运行上面的小提琴,您将看到查询2的总数为TOTAL,查询4的标识符为空。奇怪的是,子查询(表中的#1,视图中的#3)似乎都返回了完全相同的数据!

这是预期的行为吗?我猜测这与执行顺序有关,子查询尝试拉出之后,选择或分组视图正在发生?

显然,通过抛弃子选择并执行此操作很容易解决

SELECT COALESCE(label,'TOTAL') as label,COUNT(id) as cnt FROM test_view GROUP BY label WITH ROLLUP;

但这是现实世界,恐怕我无法做到,外部查询功能更多,并且在我们庞大的代码库中的许多地方都存在。

我很感谢任何人可能提供的任何见识。

干杯,

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)