Mysql创建group_concat联合

标签 mysql sql

我有 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意味着我需要唯一的名称列表作为Name

最佳答案

您需要对union执行group_concat():

(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 作用域规则,这行不通——你要深入两层。因此,一种解决方案是:

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

遗憾的是,性能可能会很糟糕,因为通常会阻止索引的使用。

嗯。 。 。获得唯一性并仍然使用索引的一种方法可能是简单的串联:

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 匹配的索引。

关于Mysql创建group_concat联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36581389/

相关文章:

php - Mysql/php Connection、Config、Index、Query、buffers、nfi im out of options

php - 如何将PHP排序替换为SQL?

sql - 在自连接字段上执行递归 SQL 查询的最佳方法是什么(以及通过 nhibernate 执行此操作?)

javascript - 如何使用java脚本或jquery从php选择项获取值,其中选择项值来自查询mysql

mysql - 我是 sql 新手,我正在使用 mysql,我不能使用复制表并创建本地临时表和全局临时表

多行插入中的 MySQL AUTO INCREMENT 行为

MySQL:如何获取最后一次插入数据库的时间戳

sql - 使用 SQL 分组时计算行之间的差异

mysql - MySQL等同于Oracle的SEQUENCE.NEXTVAL

sql - 您可以在 select 命令中创建一个 case 语句来评估两个不同的表字段吗?