[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;

结果展示:

1.直接使用GROUP_CONCAT(字段名)

SELECT GROUP_CONCAT(spending) FROM spend;

结果展示:

2.以buyer进行分组,把spending字段的值在同一行打印出来,逗号分隔(默认)

SELECT buyer,GROUP_CONCAT(spending) 
FROM spend
GROUP BY buyer;

结果展示:

3. 以buyer进行分组,把spending字段的值在同一行打印出来,'+'加号分隔

SELECT buyer,GROUP_CONCAT(spending SEPARATOR '+') 
FROM spend
GROUP BY buyer;

结果展示:

4.以buyer进行分组,把去除重复冗余的spending字段的值打印在同一行,'+'加号分隔

SELECT buyer,GROUP_CONCAT(DISTINCT spending SEPARATOR '+') 
FROM spend
GROUP BY buyer;

结果展示:

5.以buyer进行分组,把去除重复冗余的spending字段的值打印在同一行,'+'加号分隔,按照  spending倒序排列

SELECT buyer,
       GROUP_CONCAT(DISTINCT spending ORDER BY spending DESC SEPARATOR '+') 
FROM spend
GROUP 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;

结果展示:

  • 26
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值