首页 > 解决方案 > 使用带有视图的汇总会给我一个空字段?

问题描述

几天来,我一直在努力解决这个问题,所以我决定创建一个示例数据集来向自己证明,破坏事情的不是我们的整体架构。但不,它仍然会发生。

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');

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

所以我们有一个包含一些数据的表,然后我们使用 group by 和 rollup 选择它:

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, 'TOTAL') as wrap_label, label, cnt FROM
(
    SELECT label, COUNT(id) as cnt FROM test_view GROUP BY label WITH ROLLUP
) as d;

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

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

显然,这很容易通过放弃子选择并做

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

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

我将不胜感激任何人可能拥有的任何见解。

干杯,西。

标签: mysqlviewsubqueryrollup

解决方案


推荐阅读