MYSQL: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代码
  1. 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代码
  1. SUBSTRING_INDEX(str,delim,count)   
  2. 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符:   
在上面一个例子中,我们使用“,”来分隔数据,取前面2个,就可以这样写:
SQL代码
  1. SELECT `id`,SUBSTRING_INDEX(SELECT `id`,GROUP_CONCAT(`name` ORDER BY `name` DESC SEPARATOR ','),',',2) AS `name` FROM `ta` GROUP BY `id`

你可能感兴趣的:(sql,C++,c,mysql,C#)