[Mysql] GROUP_CONCAT函数
GROUP_CONCAT函数用于将GROUP BY产生的同一个分组中的值连接起来,返回一个字符串结果
GROUP_CONCAT函数首先根据GROUP BY指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔,由函数参数(字段名)决定要返回的列
语法结构
GROUP_CONCAT([DISTINCT] 要连接的字段 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR '分隔符'])
说明:
(1) 使用DISTINCT可以排除重复值
(2) 如果需要对结果中的值进行排序,可以使用ORDER BY子句
(3) SEPARATOR '分隔符'是一个字符串值,默认为逗号
导入数据
DROP TABLE IF EXISTS `spend`;CREATE TABLE `spend` ( `id` int(11) NOT NULL AUTO_INCREMENT, `buyer` varchar(255) DEFAULT NULL, `spending` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;INSERT INTO `spend` VALUES ('1', 'Odin', '50');INSERT INTO `spend` VALUES ('2', 'Odin', '50');INSERT INTO `spend` VALUES ('3', 'Odin', '60');INSERT INTO `spend` VALUES ('4', 'Odin', '70');INSERT INTO `spend` VALUES ('5', 'Jack', '100');INSERT INTO `spend` VALUES ('6', 'Jack', '110');INSERT INTO `spend` VALUES ('7', 'Mark', '150');INSERT INTO `spend` VALUES ('8', 'Mark', '150');
spend表
下列进行用法演示:
SELECT buyer, spending FROM spend;
结果展示:
直接使用GROUP_CONCAT(字段名)
SELECT GROUP_CONCAT(spending) FROM spend;
结果展示:
以buyer进行分组,把spending字段的值在同一行打印出来,逗号分隔(默认)
SELECT buyer,GROUP_CONCAT(spending) FROM spendGROUP BY buyer;
结果展示:
以buyer进行分组,把spending字段的值在同一行打印出来,'+'加号分隔
SELECT buyer,GROUP_CONCAT(spending SEPARATOR '+') FROM spendGROUP BY buyer;
结果展示:
以buyer进行分组,把去除重复冗余的spending字段的值打印在同一行,'+'加号分隔
SELECT buyer,GROUP_CONCAT(DISTINCT spending SEPARATOR '+') FROM spendGROUP BY buyer;
结果展示:
以buyer进行分组,把去除重复冗余的spending字段的值打印在同一行,'+'加号分隔,按照 spending倒序排列
SELECT buyer, GROUP_CONCAT(DISTINCT spending ORDER BY spending DESC SEPARATOR '+') FROM spendGROUP BY buyer;
结果展示:
扩展案例
导入数据
DROP TABLE IF EXISTS game_ranking; CREATE TABLE game_ranking( game VARCHAR(8), category VARCHAR(16), downloads INT(8) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; INSERT INTO game_ranking (game,category,downloads) VALUE ('A','puzzle',13628) ,('B','shooting',2830) ,('C','shooting',1920) ,('D','action',23800) ,('E','puzzle',842) ,('F','shooting',48201) ,('G','action',4532) ,('H','puzzle',1028) ,('I','action',48910) ,('J','shooting',342) ,('K','puzzle',32456) ,('L','action',2801) ,('M','puzzle',1248) ,('N','action',8756);
game_ranking表 (游戏下载量排行表)
game: 游戏名称 (字段类型: VARCHAR)
category: 游戏类别 (字段类型: VARCHAR)
downloads: 游戏下载量 (字段类型: INT)
问题: 查询每个类别下载量排在前两名的游戏,输出内容包括: category(游戏类别),game(游戏名称)
解题思路: 通过分组统计,在每组内按照游戏下载量降序排列并使用GROUP_CONCAT函数进行连接,然后使用SUBSTRING_INDEX函数取出前两个游戏名称即可得到结果
SELECT category, SUBSTRING_INDEX(GROUP_CONCAT(game ORDER BY downloads DESC),',',2)AS game FROM game_ranking GROUP BY category;
结果展示:
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341