group_concat()函数总结----解决Mysql查询多列结果集合并的问题

1、group_concat()函数说明及应用场景

查阅Mysql参考手册上,该函数返回带有来自一个组的连接的非NULL值的字符串结果;其完整的语法如下所示:

GROUP_CONCAT([DISTINCT] expr [,expr ...]

             [ORDER BY {unsigned_integer | col_name | expr}

                 [ASC | DESC] [,col_name ...]]

             [SEPARATOR str_val])

下面我们结合一个实例来解释
现有两张表,一张表为A
Z~[4_CGM{[F(0I[CERFTP$W.png
另一张表为B
3Q`@~0CBFC%ZFB5X}~B{MC1.png
现在我们需要得到id=1的A表中的id,provider,province,city,district的信息和B表中的user_name;
我们可以很容易的想到用一个左连接来解决我们的问题,
使用的原生sql语句:

SELECT `a`.`id`, `a`.`provider`, `a`.`province`, `a`.`city`, `a`.`district`, `b`.`user_name` FROM `A` as `a` LEFT JOIN `B` as `b` ON a.id = b.account_entity_id

左连接实际得到的结果集如下:
%OTS493%D(~F427)XC22P{X.png
此时提出新的问题,假如我们需要把id相同下的user_name都放到一起去显示,如果我们不是做前后端分离应用的话,需要自己去处理这边数据去输出的话,那么1、在遍历输出的时候,则会有一堆的判断;2、或者重新组装数据来进行,下面是我写的一个重新组装的方法,虽然我们可以把相同Id的数据存入同一个数组中,user_name也可以放在一起读出,但是当数据变得庞大的时候,方法将会变得十分的臃肿,而且相似需求的地方都这么处理的话,会让人犯恶心的。那么这个时候,我们就可以用group_concat()函数来解决这个数据集合并的问题。

 <?php
                        $tmp = [];
                            foreach ($dataList as $value){
                                if($tmp[$value['id']]){
                                    $tmp[$value['id']]['id'] = $value['id'];
                                    $tmp[$value['id']]['province'] = $value['province'];
                                    $tmp[$value['id']]['city'] = $value['city'];
                                    $tmp[$value['id']]['district'] = $value['district'];
                                    $tmp[$value['id']]['user_name'] = $value['user_name'];
                                }else{
                                    $tmp[$value['id']]['id'] = $value['id'];
                                    $tmp[$value['id']]['province'] = $value['province'];
                                    $tmp[$value['id']]['city'] = $value['city'];
                                    $tmp[$value['id']]['district'] = $value['district'];
                                    $tmp[$value['id']]['user_name'] .= '、',$value['user_name'];
                                }
                            }
                        ?>

此时的sql语句为

SELECT `a`.`id`, `a`.`provider`, `a`.`province`, `a`.`city`, `a`.`district`, GROUP_CONCAT(`b`.`user_name`) as name_list FROM `db_back_end`.`account_entity` `a` LEFT JOIN `db_back_end`.`account_entity_manager` `b` ON a.id = b.account_entity_id GROUP BY `a`.`id`

结果集为
Q$HB}2R}IV6Z45O`Y[M$}$O.png
GROUP_CONCAT()默认的分隔符为',',假如我们需要以'、'来进行分隔,可以这样写

group_concat(b.user_name separator '、')

在学习这个函数的时候,也遇到了concat函数,也挺方便我们对数据进行操作的。

2、group_concat()在Yii2、thinkphp中的用法

1、在Yii中通过Querybuild来创建带有group_concat()函数的query

$query = (new Query())
            ->select([
                "a.id",
                "a.provider",
                "a.province",
                "a.city",
                "a.district",
                "group_concat(b.user_name separator '、')"
            ])
            ->from('A AS a')
            ->leftJoin('B AS b','a.id = b.account_entity_id')
            ->groupBy('a.id')
            ->all();

2、thinkphp中用左连接使用group_concat函数

      D('A')->field('......')->join('LEFT JOIN __B__  ON __A__.id = __B__.account_entity_id')->select();

3、group_concat()函数的在性能上的测试

--to be done

添加新评论