表结构
CREATE TABLE `test3` (
`id` int(5) unsigned NOT NULL AUTO_INCREMENT,
`name1` varchar(10) DEFAULT NULL,
`name2` varchar(10) DEFAULT NULL,
`cnt` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
数据
1 rank1subrank11
2 rank1 subrank1 2
3 rank2 subrank1 7
4 rank2 subrank2 2
5 rank3 subrank1 1
6 rank1 subrank2 3
CONCAT的语法 CONCAT(str1,str2,…)
sql 的实际执行情况 SELECT *,CONCAT(id,',',name1,'--',name2) AS con FROM test3;
1 rank1subrank111,rank1--subrank1
2 rank1 subrank1 2 2,rank1--subrank1
3 rank2 subrank1 7 3,rank2--subrank1
4 rank2 subrank2 2 4,rank2--subrank2
5 rank3 subrank1 1 5,rank3--subrank1
6 rank1 subrank2 3 6,rank1--subrank2
CONCAT_WS的语法CONCAT_WS(separator,str1,str2,…)
sql 的实际执行情况 SELECT *,CONCAT_WS(',',id,name1,name2) AS con FROM test3;
1rank1subrank111,rank1,subrank1
2 rank1 subrank1 2 2,rank1,subrank1
3 rank2 subrank1 7 3,rank2,subrank1
4 rank2 subrank2 2 4,rank2,subrank2
5 rank3 subrank1 1 5,rank3,subrank1
6 rank1 subrank2 3 6,rank1,subrank2
可以看出CONCAT_WS 是CONCAT的特殊情况, 制定加入字符串间的 符号,无需分别指明
group_concate的语法 select str1,...group by (strx) from table group by str1;
可以将按照字符串分组时,分组
建表:
CREATE TABLE `test4` (
`id` int(11) DEFAULT NULL,
`name` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
数据:
insert into test4 (id,name) values (1,"aa"),(1,"bb"),(1,"cc"),(2,"dd"),(2,"ee"),(3,"ff");
sql语句:
select id ,group_concat(name) from test4 group by id;
select id ,group_concat(name separator ';') from test4 group by id; 使用自定义分隔符
结果:
1 aa,bb,cc
2 dd,ee
3 ff
可以 使用group_concat 将 使用 group by时去除的重复列的数据去除,组成新的一列;
group_concat(参数) 其中 参数 可以是 "字段"或"字符串"
以下是sql 错误时发现的现象,可以部分说明group_concat 的执行原理
select id ,group_concat("name") from test4 group by id;
1 name,name,name
2 name,name
3 name
可以说明 group_concat 是先计算group by str 的 每一个分组中的去除重复列的 数目,再使用 group_concat("参数") 替换