文中使用的例子均在数据库表 db1 下执行

concat () 函数

功能:将多个字符串连接成一个字符串(任何一个参数为 null,则返回值为 null)

  1. 举例
mysql> select concat(id,name,score)as info from db1;
+------+------+
| info |
+------+------+
|1小明0|
|2小王0|
|3小王0|
|4小李0|
|NULL  |
|6小紫0|
+------+------+
6 rows in set (0.00 sec)

第 5 行为 NULL 是因为 db1 表中有一行的 score 值为 null

  1. 分隔符
mysql> select concat(id,',',name,',',score)as info from db1;
+------+------+
| info |
+------+------+
|1,小明,0|
|2,小王,0|
|3,小王,0|
|4,小李,0|
|NULL    |
|6,小紫,0|
+------+------+
6 rows in set (0.00 sec)

虽然分隔符是放上去了,但却是一个一个加上去的,着实有些麻烦。有什么更加简便的方法呢?

concat_ws () 函数

功能:和 concat () 一样,将多个字符串连接成一个字符串;但是可以一次性指定分隔符

  1. 举例
mysql> select concat_ws(',',id,name,score)as info from db1;
+------+------+
| info |
+------+------+
|1,小明,0|
|2,小王,0|
|3,小王,0|
|4,小李,0|
|NULL    |
|6,小紫,0|
+------+------+
6 rows in set (0.00 sec)

group_concat () 函数

先理解一下 group by,实际上就是分类汇总,把相同的归为一类。
关于 group by 的使用可以参考下篇博文:
浅析 SQL 中 Group By 的使用

  1. 举例
mysql> select name,min(id) from db1 group by name;
+------+------+---+
| name | min(id) |
+------+------+---+
|        |      7|
|krytios |      8|
|lxscloud|      9|
| 小李   |      3|
|gundum  |      2|
|  小紫  |      1|
+------+------+---+
6 rows in set (0.00 sec)

下面我来解释一下这段是什么意思:

首先看 select name,min (id) from db1,就是查询 db1 库里 name 和最小 id 的所有数据;

其次 group by name 就是把 name 相同的的人中最小的 id 列出。

  1. 查询 name 相同的人的所有的 id 呢?
mysql> select name,min(id) from db1 order by name;
+------+------+---+
| name | min(id) |
+------+------+---+
|        |      7|
|kyritios|      8|
|lxscloud|      9|
|kyritios|      3|
|lxscloud|      2|
|  小紫  |      1|
+------+------+---+
6 rows in set (0.00 sec)
  1. 更进一步的
mysql> select name,group_concat(id) from db1 group by name;
+------+------+------+
| name | group_concat(id) |
+------+------+------+
|        |      7    |
|kyritios|      8    |
|lxscloud|      9    |
|小王    |      9,8  |
|小明    |      9,2,6|
|  小紫  |      1,9,2|
+------+------+------+
6 rows in set (0.00 sec)

使用 group_concat () 和 group by 显示相同名字的人的 id 号

若是想要 id 号排序呢?

  1. 走着!!
mysql> select name,group_concat(id order by id desc separator '_') from db1 group by name;
+------+------+------++------+------++------+------++------+------+
| name | group_concat(id order by id desc separator '_') |
+------+------+------++------+------++------+------++------+------+
|        | 7                                             |
|kyritios| 8                                             |
|lxscloud| 9                                             |
|小王    | 3                                              |
|小明    | 2_5_6                                          |
|  小紫  | 1_7                                            |
+------+------+------++------+------++------+------++------+------+
6 rows in set (0.00 sec)
  1. 还没完
mysql> select name,group_concat( concat_ws('-',id,score)order by id ) from db1 group by name;
+------+------+------++------+------++------+------++------+------+
| name | group_concat( concat_ws('-',id,score)order by id ) |
+------+------+------++------+------++------+------++------+------+
|        | 7-0                                                |
|kyritios| 8-80                                                |
|lxscloud| 9-0                                                |
|小王    | 3-0                                                 |
|小明    | 2-0,5-0,6-0                                       |
|  小紫  | 1-0,7-0                                           |
+------+------+------++------+------++------+------++------+------+
6 rows in set (0.00 sec)
  1. 以 id 分组,把去除重复后的 name 字段的值打印在一行,逗号分隔
mysql> select id,group_concat(distinct name) from aa group by id;
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20 |
|3 | 200,500 |
+------+-----------------------------+
3 rows in set (0.00 sec)

DISTINCT 子句用于在连接分组之前消除组中的重复值

  1. 以 id 分组,把 name 字段的值打印在一行,逗号分隔,以 name 排倒序
mysql> select id,group_concat(name order by name desc) from aa group by id;
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10 |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
3 rows in set (0.00 sec)

order by 如果要按降序对值进行排序,则需要明确指定 DESC 选项

更新于

请我喝[茶]~( ̄▽ ̄)~*

1sme 微信支付

微信支付