首页 > 解决方案 > SQL - Left Join 和 Group By 导致第二个表中的行数据混淆

问题描述

我有两个表,第一个表引用了第二个表中的 id,我想进行一个查询,该查询涉及左连接与第二个表中的字段以及选择中的 COUNT 函数,因为 COUNT函数,我使用的是 GROUP BY 子句。

所以我的查询看起来像:

SELECT t1.id, t1.txt, t2.id, t2.txt, COUNT(t2.id) 
FROM test_data1 t1 
LEFT JOIN test_data2 t2 ON (t1.ref_col = t2.id) 
GROUP BY t1.id

在我的表中,只有 test_data1 的第二行在 ref_col 中有一个条目,所以我希望对于结果中的第一行,t2.id 的值为 NULL,但事实并非如此(在我的示例中,我看到值 2,但我不确定这里是否可能存在随机元素)。

如果我使用

SELECT MAX(t1.id), MAX(t1.txt), MAX(t2.id), MAX(t2.txt), COUNT(t2.id) 
FROM test_data1 t1 
LEFT JOIN test_data2 t2 ON (t1.ref_col = t2.id) 
GROUP BY t1.id

我得到了我的预期结果,但是我很惊讶这是必要的,因为 test_data2 中最多只有一个条目与 test_data1 中的 ref_col 匹配。

有谁知道为什么 LEFT JOIN + GROUP BY 会这样?这是在 Linux 上使用 MySQL 版本 8。

如果你想在这里重现这个是表定义:

CREATE TABLE test_data1 (id int unsigned NOT NULL AUTO_INCREMENT, 
                         txt VARCHAR(45) DEFAULT NULL, 
                         ref_col int unsigned DEFAULT NULL, PRIMARY KEY (id));

CREATE TABLE test_data1 (id int unsigned NOT NULL AUTO_INCREMENT, 
                         txt VARCHAR(45) DEFAULT NULL, 
                         ref_col int unsigned DEFAULT NULL, PRIMARY KEY (id));

INSERT INTO test_data1 (id, txt, ref_col) 
VALUES 
(1,'zz',NULL), 
(2,'yy',2), 
(3,'xx',NULL);

INSERT INTO test_data2 (id, txt) 
VALUES 
(1,'aa'), 
(2,'bb'), 
(3,'cc'), 
(4,'dd');

标签: mysqlsqlgroup-byleft-join

解决方案


推荐阅读