Mysql 将汇总与视图一起使用会给我一个空字段吗?

Mysql 将汇总与视图一起使用会给我一个空字段吗?,mysql,view,subquery,rollup,Mysql,View,Subquery,Rollup,这几天我一直在绞尽脑汁,所以我决定创建一个样本数据集,以向我自己证明,破坏这些东西的不是我们的单一模式。但不,它仍然会发生 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;

这几天我一直在绞尽脑汁,所以我决定创建一个样本数据集,以向我自己证明,破坏这些东西的不是我们的单一模式。但不,它仍然会发生

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, 'red'),
(3, 'red'),
(4, 'red'),
(5, 'green'),
(6, 'green'),
(7, 'green'),
(8, 'yellow'),
(9, 'yellow'),
(10, 'yellow'),
(11, 'blue'),
(12, 'blue'),
(13, 'blue'),
(14, 'blue'),
(15, 'blue'),
(16, 'blue');
因此,我们有一个包含一些数据的表,然后使用group by with rollup选择它:

SELECT label, COUNT(id) as cnt FROM test_data GROUP BY label WITH ROLLUP
然后还有另一个围绕这个的查询,在现实世界中它做其他事情,在这个例子中,它只是从select中提取数据

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_标签。但是,如果有一个视图本质上是一个从涉及的测试数据中选择*的视图,它将停止拉出包裹标签:

SELECT COALESCE(label, 'TOTAL') as wrap_label, label, cnt FROM
(
    SELECT label, COUNT(id) as cnt FROM test_view GROUP BY label WITH ROLLUP
) as d;
如果运行上面的fiddle,您将看到查询2有一个TOTAL,查询4有一个空标识符。奇怪的是,表中的子查询1和视图中的子查询3似乎返回完全相同的数据

这是预期的行为吗?我猜这与执行顺序有关,并且视图中的select或groupby是在子查询尝试拉取之后发生的

显然,这很容易通过放弃子选择并执行以下操作来解决

SELECT COALESCE(label, 'TOTAL') as label, COUNT(id) as cnt FROM test_view GROUP BY label WITH ROLLUP;
但这是真实的世界,我恐怕做不到,外部查询做的更多,在我们庞大的代码库中的许多地方

我很感激任何人可能有任何见解

干杯,
Si.

您可以在应用程序代码中执行汇总操作。可能是dbfiddle是错误的。查询4在我的服务器上运行良好。我建议您在本地进行测试。@p.Salmon这很有趣,因为fiddle的结果几乎反映了我们在服务器上得到的结果。由于某种原因,我们得到了一个零,而不是一个空白字段。@如果我是从零开始的,我肯定会同意,阻力最小的路径等等。不幸的是,我们有两个巨大的代码库共享同一个数据库,其中一个有视图,从资源的角度来看,全面地进行更改是站不住脚的。所以我真的希望有人能给我展示一下mysql方面的工作: