查看: 411|回复: 0

GROUP_CONCAT,SUBSTRING_INDEX的妙用

 关闭 [复制链接]

签到天数: 2589 天

连续签到: 3 天

[LV.Master]至尊海神IIIIII

发表于 2010-6-4 20:01 | 显示全部楼层 |阅读模式
GROUP_CONCAT,SUBSTRING_INDEX的妙用


在一个表ta中数据为:
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  1 | b    |
|  1 | c    |
|  1 | d    |
|  2 | a    |
|  2 | b    |
|  2 | c    |
|  3 | d    |
+----+------+
从里面取数据要求完成如下效果:
+----+--------+
| id | name    |
+----+--------+
|  1 | a,b,c,d |
|  2 | a,b,c    |
|  3 | d         |
+----+--------+
在MySQL4.1中,加入了GROUP_CONCAT这个函数,我们就可以很轻松的完成这个任务
SQL代码
SELECT `id`,GROUP_CONCAT(`name` ORDER BY `name` DESC SEPARATOR ",") AS name FROM `ta` GROUP BY `id`  
但是如果要取得每个ID的前2个数据时即完成如下效果:
+----+------+
| id | name |
+----+------+
|  1 | a,b    |
|  2 | a,b    |
|  3 | d       |
+----+------+
因为GROUP_CONCAT函数虽然支持ORDER BY但是却不支持LIMIT,这个时候只能用变通的手段了,用SUBSTRING_INDEX函数,这个函数在MySQL手册中的说明是:
SQL代码
SUBSTRING_INDEX(str,delim,count)   
返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符:   
在上面一个例子中,我们使用“,”来分隔数据,取前面2个,就可以这样写:

SQL代码
SELECT `id`,SUBSTRING_INDEX(SELECT `id`,GROUP_CONCAT(`name` ORDER BY `name` DESC SEPARATOR ","),',',2) AS `name` FROM `ta` GROUP BY `id`
<
PCOS系统下载站:http://zhuangji.wang

本版积分规则