amwdnuff 发表于 2010-6-8 22:20

GROUP_CONCAT,SUBSTRING_INDEX的妙用

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`
页: [1]
查看完整版本: GROUP_CONCAT,SUBSTRING_INDEX的妙用