MySQL将多条记录的单个字段合并成一条记录

有时候我们经常需要链表查询数据,但是有很多冗余数据 如 以下sql:

SELECT g.goods_id,g.goods_name,ga.attr_value 
       FROM zljk_goods_attr AS ga LEFT JOIN zljk_goods AS g ON ga.goods_id = g.goods_id 
       WHERE ga.attr_id IN(211,212,213,216)

1q2w3e4r.png

结果,我们看到上面2件商品都有很多商品属性 但是却重复的显示很多条数据 我们想要的效果是 每一件商品 不管它有多少商品属性 我们只要一条数据显示出来 即多行数据转成单列显示


GROUP_CONCAT()登场!!!这个函数好啊,能将相同的行组合起来,省老事了!!!


修改后的sql如下:

SELECT g.goods_id,g.goods_name,GROUP_CONCAT(ga.attr_value) as concat
       FROM zljk_goods_attr AS ga LEFT JOIN zljk_goods AS g ON ga.goods_id = g.goods_id
       WHERE ga.attr_id IN(211,212,213,216) AND g.goods_id IN(51,23)  GROUP BY g.goods_id

QQ截图20180723230626.png

可以看到 根据goods_id分组 并且concat默认用'逗号'分割 !!

看到没 成功的将商品的属性只显示在单行数据内 消除了冗余数据(一件商品有多少属性 就显示多少行商品数据 唯一区别就是 每一行的商品是一样的 只是商品属性不同)。


注:GROUP_CONCAT()只有与GROUP BY语句同时使用才能产生效果


完整语法如下:

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])


用group_concat连接字段的时候是有长度限制的 并不是有多少连多少 但你可以在mysql的配置文件中配置group_concat_max_len选项来控制 group_concat_max_len=1024(这是默认的配置)。是不是真的有长度限制 博主没试验过 有兴趣的话可以自己试验下。


关于此函数使用还可参考以下链接:

https://www.cnblogs.com/thiaoqueen/p/7710927.html

https://blog.csdn.net/yz357823669/article/details/78794050

https://www.cnblogs.com/wenxinphp/p/5841430.html


后记:

关于这个group_concat()函数。。 貌似很多人都不知道呢。。


PS:

洞房花烛烛成灰 新娘含羞把灯吹 金针刺入桃花蕊 不敢高声暗流水   ---摘自某网友


哎呀 好污的赶脚。。。。。


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与