SET group_concat_max_len =CAST( (SELECTSUM(LENGTH(hobbies)) +COUNT(*) * LENGTH(', ') FROM peoples_hobbies GROUPBY person_id) AS UNSIGNED);
结合IN子句
当需要汇总特定行时,可结合IN子句:
1
SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);
与子查询结合
1 2 3 4
SELECT i.*, (SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist FROM items i WHERE i.id = $someid
不使用GROUP_CONCAT函数
1 2 3 4 5 6 7 8 9
Set@concatHobbies=''; SELECTTRIM(LEADING', 'FROM T.hobbies ) FROM ( select Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies from peoples_hobbies )T Orderby Id DESC LIMIT 1
结合临时变量
1
SELECT@logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
使用Pivot表
1 2 3 4 5
SELECT pm.id, pm.name, GROUP_CONCAT(c.name) as channel_names FROM payment_methods pm LEFTJOIN payment_methods_channels_pivot pmcp ON pmcp.payment_method_id = pm.id LEFTJOIN channels c ON c.id = pmcp.channel_id GROUPBY pm.id
核心代码
以下是一些常用的核心代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-- 基本GROUP_CONCAT用法 SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') FROM peoples_hobbies WHERE person_id =5;
-- 结合子查询 SELECT i.*, (SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist FROM items i WHERE i.id = $someid
-- 不使用GROUP_CONCAT实现行合并 Set@concatHobbies=''; SELECTTRIM(LEADING', 'FROM T.hobbies ) FROM ( select Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies from peoples_hobbies )T Orderby Id DESC LIMIT 1
最佳实践
选择合适的分隔符:根据实际需求选择合适的分隔符,如逗号、加号等。
处理长度限制:若结果可能超过默认长度限制,提前修改group_concat_max_len。
避免重复值:若需要去重,使用DISTINCT操作符。
常见问题
结果被编码为二进制格式:若结果被编码为二进制格式,可将结果转换为字符类型,如SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table。