我有2个子查询
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
,这意味着我需要名称唯一的名单列表
答案 0 :(得分: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
匹配的索引。