我可以在MySQL中按分组,但在分组时忽略空值,必要时删除结果行吗?

我可以在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

我的桌子:

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 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