2016-04-12 28 views
0

我有2子查询mysql的创建GROUP_CONCAT工会

1:

(select group_concat(a.name) 
from A a 
where a.id = c.a_id) as name 

2:

(select group_concat(a.name) 
from A a 
where a.id = b.a_id) as name 

现在我需要创建一个union它意味着我需要名字的唯一列表作为名称

回答

1

你需要做的group_concat()union

(select group_concat(abc.name) 
from ((select name from A a where a.id = c.a_id) 
     union 
     (select name from A a where a.id = b.a_id) 
    ) abc 
) 

但是,唉,这不会因为MySQL范围规则的作用 - 你要深入两层。所以,一个解决办法是or

(select group_concat(abc.name) 
from A a 
where a.id = c.a_id or a.id = b.a_id) 
) abc 

可悲的是,性能可能会是糟糕的,因为通常or防止使用索引。

嗯。 。 。你可以得到独特性,还有一种方式使用索引可能是简单的串联:

concat_ws(',', 
      (select group_concat(abc.name) 
      from A a 
      where a.id = c.a_id 
     ), 
      (select group_concat(abc.name) 
      from A a 
      where a.id = c.a_id and a.id <> b.a_id 
     ) 
     ) 

这不是100%万无一失(两个不同的a.id行可能有导致重复相同的名称)。但是在很多情况下,这可以起作用,每个子查询都应该利用id匹配的索引。

+0

HI Gordon早上好。我在concat_ws –

+0

@BhushanUniyal的情况下出错。 。 。什么样的错误?你的问题被标记为“mysql”和'concat_ws()'是一个非常MySQL的函数:http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat-ws。 –

+0

你能简单介绍一下a.id <> b.a_id吗? –