我可以在MySQL中按分组,但在分组时忽略空值,必要时删除结果行吗?
我的桌子: t1 t2 t3 如果我运行一个查询并按顺序左键连接3个表,我会得到:我可以在MySQL中按分组,但在分组时忽略空值,必要时删除结果行吗?,mysql,group-by,left-join,Mysql,Group By,Left Join,我的桌子: t1 t2 t3 如果我运行一个查询并按顺序左键连接3个表,我会得到: 1 100 5 100 1 100 6 200 1 100 6 300 1 200 null null 1 300 null null 2 400 null null 如果我通过t1.col_a,t2.col_b添加组: 1 100 5 100 1 100 6 (200 or 3
1 100 5 100
1 100 6 200
1 100 6 300
1 200 null null
1 300 null null
2 400 null null
如果我通过t1.col_a,t2.col_b添加组:
1 100 5 100
1 100 6 (200 or 300)
1 (200 or 300) null null
2 400 null null
但我不想显示第三行,因为它在t2.col_b中没有值。我可以在该列不为null的位置添加一个条件,但这将删除需要保留的最后一行
在一个完美的查询中,我希望看到:
1 100 5 100
1 100 6 (200 or 300)
2 400 null null
试试这个。t1.col_b有点棘手,因为如果存在多个t1.col_a值,并且没有引用t2,则此查询为此选择一个随机值
SELECT
sub.col_a,
IFNULL(sub.relation,t1.col_b),
t2.col_b,
t3.col_b
FROM(
SELECT
t1.col_a,
group_concat(DISTINCT t2.col_a) AS relation
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t2.col_a = t1.col_b
GROUP BY t1.col_a
) AS sub
LEFT JOIN table1 AS t1
ON t1.col_a = sub.col_a
AND (t1.col_b IN (sub.relation) OR sub.relation IS NULL)
LEFT JOIN table2 AS t2
ON t2.col_a = t1.col_b
LEFT JOIN table3 AS t3
ON t3.col_a = t2.col_b
GROUP BY t1.col_a, t2.col_b
一种方法是仅选择非空行作为结果的一部分,然后将其与更广泛但分组的结果集合并:
SELECT * FROM t1
JOIN t2 ON t1.col_b = t2.col_a
LEFT JOIN t3 ON t2.col_b = t3.col_a
UNION
SELECT * FROM t1
LEFT JOIN t2 ON t1.col_b = t2.col_a
LEFT JOIN t3 ON t2.col_b = t3.col_a
GROUP BY t1.col_a
请注意,第一个查询没有左连接。这是因为我们不希望该查询中出现任何空结果。该查询为您提供:
t1.col_a t2.col_a t3.col_a t3.col_b
1 100 5 100
1 100 6 200
1 100 6 300
t1.col_a t2.col_a t3.col_a t3.col_b
1 100 5 100
2 400 NULL NULL
第二个查询为您提供:
t1.col_a t2.col_a t3.col_a t3.col_b
1 100 5 100
1 100 6 200
1 100 6 300
t1.col_a t2.col_a t3.col_a t3.col_b
1 100 5 100
2 400 NULL NULL
最后,当您进行并集时,它将消除重复的结果。第一个结果集中的第一行等于第二个结果集中的第一行。这是的默认行为,导致:
t1.col_a t2.col_a t3.col_a t3.col_b
1 100 5 100
1 100 6 200
1 100 6 300
2 400 NULL NULL
为什么你不想要第三排,而是最后一排。两行都与t2没有关系。如果没有规则,就不可能删除一行并获取另一行。基本上,第一个表表示用户,第二个表是用户的属性,第三个表是属性的属性。我希望所有用户都能显示,无论他们是否分配了任何属性——这就是为什么最后一行必须保留的原因。我不想显示第三行,因为我已经为该用户显示了两行。我意识到第二个结果列中有唯一的信息,但我真正关心的是在第三个表唯一时复制用户行。
t1.col_a t2.col_a t3.col_a t3.col_b
1 100 5 100
1 100 6 200
1 100 6 300
2 400 NULL NULL