有时候我们经常需要链表查询数据,但是有很多冗余数据 如 以下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)
结果,我们看到上面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
可以看到 根据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:
洞房花烛烛成灰 新娘含羞把灯吹 金针刺入桃花蕊 不敢高声暗流水 ---摘自某网友
哎呀 好污的赶脚。。。。。
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论