参考:

1、 MySQL开发技巧

2、 MySQL开发技巧2

3、MySQL开发技巧3

行转列

利用序列表处理行转列的数据

mysql> desc user1;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| user_name | varchar(30)      | NO   | MUL | NULL    |                |
| over      | varchar(50)      | YES  |     | NULL    |                |
| mobile    | varchar(100)     | YES  |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
4 rows in set (0.03 sec)mysql> set names 'gbk';
Query OK, 0 rows affected (0.00 sec)mysql> update user1 set mobile='12112341234,14112341234,16112341234' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update user1 set mobile='12177778888,13944445555,16188885555,18122223333' where id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update user1 set mobile='13822225555,14177775555' where id=4;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> show create table tb_sequence\G;
*************************** 1. row ***************************Table: tb_sequence
Create Table: CREATE TABLE `tb_sequence` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)ERROR:
No query specifiedINSERT INTO tb_sequence VALUES
(),(),(),(),(),(),(),(),();mysql> select user_name,REPLACE(SUBSTRING(SUBSTRING_INDEX(mobile,',',a.id),CHAR_LENGTH(SUBSTRING_IND
EX(mobile,',',a.id-1))+1),',','') AS mobile-> FROM tb_sequence a-> CROSS JOIN(->  SELECT user_name,CONCAT(mobile,',') AS mobile,LENGTH(mobile)-LENGTH(REPLACE(mobile,',',''))+
1 size->  FROM user1-> ) b ON a.id <=b.size;
+-----------+-------------+
| user_name | mobile      |
+-----------+-------------+
| 唐僧         | 12112341234 |
| 唐僧         | 14112341234 |
| 唐僧         | 16112341234 |
| 猪八戒         | 18822225555 |
| 猪八戒         | 14188886666 |
| 孙悟空          | 12177778888 |
| 孙悟空          | 13944445555 |
| 孙悟空          | 16188885555 |
| 孙悟空          | 18122223333 |
| 沙僧        | 13822225555 |
| 沙僧        | 14177775555 |
+-----------+-------------+
11 rows in set (0.01 sec)

利用UNION的方法实现列转行

列转行的另一种场景

mysql> CREATE TABLE user1_equipment (->   id INT UNSIGNED NOT NULL AUTO_INCREMENT,->   user_id  INT UNSIGNED NOT  NULL,->   arms VARCHAR(10) NULL,->   clothing VARCHAR(10) NULL,->   shoe VARCHAR(10) NULL,->   PRIMARY KEY  (id)-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)mysql> INSERT INTO user1_equipment(user_id,arms,clothing,shoe) VALUES (3,'金箍棒','锁子黄金甲','藕丝
步云履' );
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO user1_equipment(user_id,arms,clothing,shoe) VALUES (2,'九齿钉耙','僧衣','僧鞋' );Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO user1_equipment(user_id,arms,clothing,shoe) VALUES (4,'降妖宝杖','僧衣','僧鞋' );Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO user1_equipment(user_id,arms,clothing,shoe) VALUES (1,'九环锡杖','锦斓袈裟','僧鞋
' );
Query OK, 1 row affected (0.00 sec)mysql> SELECT user_name,'arms' as equipment, arms-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id;
+-----------+-----------+----------+
| user_name | equipment | arms     |
+-----------+-----------+----------+
| 孙悟空          | arms      | 金箍棒         |
| 猪八戒         | arms      | 九齿钉耙       |
| 沙僧        | arms      | 降妖宝杖         |
| 唐僧         | arms      | 九环锡杖        |
+-----------+-----------+----------+
4 rows in set (0.01 sec)mysql> SELECT user_name,'arms' as equipment, arms-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> UNION-> SELECT user_name,'clothing' as equipment, clothing-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> UNION-> SELECT user_name,'shoe' as equipment, shoe-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id;
+-----------+-----------+------------+
| user_name | equipment | arms       |
+-----------+-----------+------------+
| 孙悟空          | arms      | 金箍棒           |
| 猪八戒         | arms      | 九齿钉耙         |
| 沙僧        | arms      | 降妖宝杖           |
| 唐僧         | arms      | 九环锡杖          |
| 孙悟空          | clothing  | 锁子黄金甲         |
| 猪八戒         | clothing  | 僧衣          |
| 沙僧        | clothing  | 僧衣          |
| 唐僧         | clothing  | 锦斓袈裟           |
| 孙悟空          | shoe      | 藕丝步云履         |
| 猪八戒         | shoe      | 僧鞋         |
| 沙僧        | shoe      | 僧鞋         |
| 唐僧         | shoe      | 僧鞋         |
+-----------+-----------+------------+
12 rows in set (0.00 sec)

使用序列化表的方法实现列转行

SELECT user_name, arms ,clothing,shoe
FROM user1 a
JOIN user1_equipment b on a.id = b.user_id
CROSS JOIN tb_sequence c
WHERE c.id<=3
ORDER BY user_name;SELECT user_name
,case when c.id=1 then arms end
,case when c.id=2 then clothing end
,case when c.id=3 then shoe end
FROM user1 a
JOIN user1_equipment b on a.id = b.user_id
CROSS JOIN tb_sequence c
WHERE c.id<=3
ORDER BY user_name;SELECT user_name
,coalesce(case when c.id=1 then arms end
,case when c.id=2 then clothing end
,case when c.id=3 then shoe end) as eq_name
FROM user1 a
JOIN user1_equipment b on a.id = b.user_id
CROSS JOIN tb_sequence c
WHERE c.id<=3
ORDER BY user_name;SELECT user_name
,case when c.id=1 then 'arms'when c.id=2 then 'clothing'when c.id=3 then 'shoe'end as equipment
,coalesce(case when c.id=1 then arms end
,case when c.id=2 then clothing end
,case when c.id=3 then shoe end) as eq_name
FROM user1 a
JOIN user1_equipment b on a.id = b.user_id
CROSS JOIN tb_sequence c
WHERE c.id<=3
ORDER BY user_name;-- 执行结果mysql> SELECT user_name, arms ,clothing,shoe-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> CROSS JOIN tb_sequence c-> WHERE c.id<=3;
+-----------+----------+------------+------------+
| user_name | arms     | clothing   | shoe       |
+-----------+----------+------------+------------+
| 孙悟空          | 金箍棒         | 锁子黄金甲         | 藕丝步云履         |
| 猪八戒         | 九齿钉耙       | 僧衣          | 僧鞋         |
| 沙僧        | 降妖宝杖         | 僧衣          | 僧鞋         |
| 唐僧         | 九环锡杖        | 锦斓袈裟           | 僧鞋         |
| 孙悟空          | 金箍棒         | 锁子黄金甲         | 藕丝步云履         |
| 猪八戒         | 九齿钉耙       | 僧衣          | 僧鞋         |
| 沙僧        | 降妖宝杖         | 僧衣          | 僧鞋         |
| 唐僧         | 九环锡杖        | 锦斓袈裟           | 僧鞋         |
| 孙悟空          | 金箍棒         | 锁子黄金甲         | 藕丝步云履         |
| 猪八戒         | 九齿钉耙       | 僧衣          | 僧鞋         |
| 沙僧        | 降妖宝杖         | 僧衣          | 僧鞋         |
| 唐僧         | 九环锡杖        | 锦斓袈裟           | 僧鞋         |
+-----------+----------+------------+------------+
12 rows in set (0.01 sec)mysql> SELECT user_name, arms ,clothing,shoe-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> CROSS JOIN tb_sequence c-> WHERE c.id<=3-> ORDER BY user_name;
+-----------+----------+------------+------------+
| user_name | arms     | clothing   | shoe       |
+-----------+----------+------------+------------+
| 唐僧         | 九环锡杖        | 锦斓袈裟           | 僧鞋         |
| 唐僧         | 九环锡杖        | 锦斓袈裟           | 僧鞋         |
| 唐僧         | 九环锡杖        | 锦斓袈裟           | 僧鞋         |
| 孙悟空          | 金箍棒         | 锁子黄金甲         | 藕丝步云履         |
| 孙悟空          | 金箍棒         | 锁子黄金甲         | 藕丝步云履         |
| 孙悟空          | 金箍棒         | 锁子黄金甲         | 藕丝步云履         |
| 沙僧        | 降妖宝杖         | 僧衣          | 僧鞋         |
| 沙僧        | 降妖宝杖         | 僧衣          | 僧鞋         |
| 沙僧        | 降妖宝杖         | 僧衣          | 僧鞋         |
| 猪八戒         | 九齿钉耙       | 僧衣          | 僧鞋         |
| 猪八戒         | 九齿钉耙       | 僧衣          | 僧鞋         |
| 猪八戒         | 九齿钉耙       | 僧衣          | 僧鞋         |
+-----------+----------+------------+------------+
12 rows in set (0.00 sec)mysql> SELECT user_name-> ,case when c.id=1 then arms end-> ,case when c.id=2 then clothing end-> ,case when c.id=3 then shoe end-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> CROSS JOIN tb_sequence c-> WHERE c.id<=3-> ORDER BY user_name;
+-----------+--------------------------------+------------------------------------+-----------------
---------------+
| user_name | case when c.id=1 then arms end | case when c.id=2 then clothing end | case when c.id=3then shoe end |
+-----------+--------------------------------+------------------------------------+-----------------
---------------+
| 唐僧         | 九环锡杖                              | NULL                               | NULL|
| 唐僧         | NULL                           | 锦斓袈裟                                   | NULL|
| 唐僧         | NULL                           | NULL                               | 僧鞋|
| 孙悟空          | 金箍棒                               | NULL                               | NULL|
| 孙悟空          | NULL                           | 锁子黄金甲                                 | NU
LL                           |
| 孙悟空          | NULL                           | NULL                               | 藕丝步云履|
| 沙僧        | 降妖宝杖                               | NULL                               | NULL|
| 沙僧        | NULL                           | 僧衣                                  | NULL|
| 沙僧        | NULL                           | NULL                               | 僧鞋|
| 猪八戒         | 九齿钉耙                             | NULL                               | NULL|
| 猪八戒         | NULL                           | 僧衣                                  | NULL|
| 猪八戒         | NULL                           | NULL                               | 僧鞋|
+-----------+--------------------------------+------------------------------------+-----------------
---------------+
12 rows in set (0.00 sec)mysql> SELECT user_name-> ,coalesce(case when c.id=1 then arms end-> ,case when c.id=2 then clothing end-> ,case when c.id=3 then shoe end) as equipment-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> CROSS JOIN tb_sequence c-> WHERE c.id<=3-> ORDER BY user_name;
+-----------+------------+
| user_name | equipment  |
+-----------+------------+
| 唐僧         | 九环锡杖          |
| 唐僧         | 锦斓袈裟           |
| 唐僧         | 僧鞋         |
| 孙悟空          | 金箍棒           |
| 孙悟空          | 锁子黄金甲         |
| 孙悟空          | 藕丝步云履         |
| 沙僧        | 降妖宝杖           |
| 沙僧        | 僧衣          |
| 沙僧        | 僧鞋         |
| 猪八戒         | 九齿钉耙         |
| 猪八戒         | 僧衣          |
| 猪八戒         | 僧鞋         |
+-----------+------------+
12 rows in set (0.01 sec)mysql> SELECT user_name-> ,case when c.id=1 then 'arms'->    when c.id=2 then 'clothing'->    when c.id=3 then 'shoe'->  end as equipment-> ,coalesce(case when c.id=1 then arms end-> ,case when c.id=2 then clothing end-> ,case when c.id=3 then shoe end) as eq_name-> FROM user1 a-> JOIN user1_equipment b on a.id = b.user_id-> CROSS JOIN tb_sequence c-> WHERE c.id<=3-> ORDER BY user_name;
+-----------+-----------+------------+
| user_name | equipment | eq_name    |
+-----------+-----------+------------+
| 唐僧         | arms      | 九环锡杖          |
| 唐僧         | clothing  | 锦斓袈裟           |
| 唐僧         | shoe      | 僧鞋         |
| 孙悟空          | shoe      | 藕丝步云履         |
| 孙悟空          | arms      | 金箍棒           |
| 孙悟空          | clothing  | 锁子黄金甲         |
| 沙僧        | shoe      | 僧鞋         |
| 沙僧        | arms      | 降妖宝杖           |
| 沙僧        | clothing  | 僧衣          |
| 猪八戒         | arms      | 九齿钉耙         |
| 猪八戒         | clothing  | 僧衣          |
| 猪八戒         | shoe      | 僧鞋         |
+-----------+-----------+------------+
12 rows in set (0.00 sec)

如何生成唯一序列号

需要使用唯一序列号的场景:

数据库主键

业务序列号如:发票号、车票好、订单号……

生成序列号的方法

MySQL AUTO_INCREMENT
SQLServer IDENTITY/SEQUENCE
Oracle SEQUENCE
PgSQL SEQUENCE

优先选择系统提供的序列号生成方式。

(会因为插入不成功,造成序号不连续)

mysql> CREATE TABLE t(->   id INT UNSIGNED NOT NULL AUTO_INCREMENT,->   PRIMARY KEY  (id)-> );
Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO t value(),();
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from t;
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.00 sec)mysql> -- 进行一个事务;
mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t value();
Query OK, 1 row affected (0.00 sec)mysql> select * from t;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)mysql> -- 回滚事务;
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t values();
Query OK, 1 row affected (0.00 sec)mysql> select * from t;
+----+
| id |
+----+
|  1 |
|  2 |
|  4 |
+----+
3 rows in set (0.00 sec)

在特殊情况下可以使用SQL方式生成序列号;

用SQL方式生成特殊的序列号

需求:生成订单序列号,并且订单号的格式如下:

YYYYMMDDNNNNNNN。如201505120000003

-- 创建数据库--
-- Table structure for table `order_seq`
--
CREATE TABLE order_seq (timestr INT UNSIGNED NOT NULL,order_sn  INT UNSIGNED NOT  NULL,PRIMARY KEY  (timestr,order_sn)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 创建存储过程mysql> CREATE PROCEDURE  seq_no()-> BEGIN->   DECLARE v_cnt INT;->   DECLARE v_timestr INT;->   DECLARE rowcount BIGINT;->   SET v_timestr = DATE_FORMAT(NOW(),'%Y%m%d');->   SELECT ROUND(RAND()*100,0)+1 INTO v_cnt;->   START TRANSACTION;->       UPDATE order_seq SET order_sn=order_sn+v_cnt WHERE timestr=v_timestr;->       IF ROW_COUNT()=0 THEN->           INSERT INTO order_seq(timestr,order_sn) VALUES (v_timestr, v_cnt);->       END IF;->       SELECT CONCAT(v_timestr,LPAD(order_sn,7,0)) AS order_sn->       FROM order_seq->       WHERE timestr = v_timestr;-> END-> //
Query OK, 0 rows affected (0.02 sec)mysql> DELIMITER ;
mysql> call seq_no();
+-----------------+
| order_sn        |
+-----------------+
| 201808100000065 |
+-----------------+
1 row in set (0.01 sec)Query OK, 0 rows affected (0.02 sec)mysql> select * from order_seq;
+----------+----------+
| timestr  | order_sn |
+----------+----------+
| 20150518 |      390 |
| 20180810 |       65 |
+----------+----------+
2 rows in set (0.00 sec)

如何查询重复数据

利用Group By和 having从句处理

mysql> --
mysql> -- Table structure for table `user1_test`
mysql> --
mysql> CREATE TABLE user1_test (->   id INT UNSIGNED NOT NULL AUTO_INCREMENT,->   user_name VARCHAR(30) NOT  NULL,->   over VARCHAR(50)   NULL,->   mobile VARCHAR(100) NULL,->   PRIMARY KEY  (id)-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)mysql>
mysql> desc use1_test;
ERROR 1146 (42S02): Table 'try1.use1_test' doesn't exist
mysql> desc user1_test;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| user_name | varchar(30)      | NO   |     | NULL    |                |
| over      | varchar(50)      | YES  |     | NULL    |                |
| mobile    | varchar(100)     | YES  |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
4 rows in set (0.04 sec)-- 插入数据,产生重复数据。
mysql> INSERT INTO user1_test(user_name,over,mobile)-> select user_name,over,mobile from user1;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0mysql> INSERT INTO user1_test(user_name,over,mobile)-> select user_name,over,mobile from user1 limit 2;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> set names 'GBK';
Query OK, 0 rows affected (0.00 sec)mysql> select user_name,count(*) from user1_test group by user_name having count(*)>1;
+-----------+----------+
| user_name | count(*) |
+-----------+----------+
| 唐僧         |        2 |
| 猪八戒         |        2 |
+-----------+----------+
2 rows in set (0.01 sec)

删除重复数据,对于相同数据保留ID最大的

DELETE a
FROM user1_test a
JOIN(SELECT user_name,count(*),MAX(id) AS idFROM user1_testGROUP BY user_nameHAVING count(*)>1
) b ON a.user_name = b.user_name
WHERE a.id<b.id;
mysql> DELETE a-> FROM user1_test a-> JOIN(->     SELECT user_name,count(*),MAX(id) AS id->     FROM user1_test->     GROUP BY user_name->     HAVING count(*)>1-> ) b ON a.user_name = b.user_name-> WHERE a.id<b.id;
Query OK, 2 rows affected (0.01 sec)mysql> select * from user1_test;
+----+-----------+------------+-------------------------------------------------+
| id | user_name | over       | mobile                                          |
+----+-----------+------------+-------------------------------------------------+
|  3 | 孙悟空          | 斗战圣佛         | 12177778888,13944445555,16188885555,181222
|  4 | 沙僧        | 金身罗汉          | 13822225555,14177775555
|  8 | 唐僧         | 旃檀功德佛         | 12112341234,14112341234,16112341234
|  9 | 猪八戒         | 净坛使者         | 18822225555,14188886666
+----+-----------+------------+-------------------------------------------------+
4 rows in set (0.00 sec)mysql>

更复杂的情况

分析:

1、列转行

2、保留唯一数据的mobile;

3、行转列

4、更新。

mysql> update user1_test set mobile='12112341234,14112341234,12112341234' where id=8;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1  Changed: 0  Warnings: 0mysql> update user1_test set mobile='12177778888,13944445555,16188885555,16188885555' where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from user1_test;
+----+-----------+------------+-------------------------------------------------+
| id | user_name | over       | mobile                                          |
+----+-----------+------------+-------------------------------------------------+
|  3 | 孙悟空          | 斗战圣佛         | 12177778888,13944445555,16188885555,16188885555 |
|  4 | 沙僧        | 金身罗汉          | 13822225555,14177775555                         |
|  8 | 唐僧         | 旃檀功德佛         | 12112341234,14112341234,12112341234             |
|  9 | 猪八戒         | 净坛使者         | 18822225555,14188886666                         |
+----+-----------+------------+-------------------------------------------------+
4 rows in set (0.00 sec)-- 1、列转行
mysql> select user_name,REPLACE(SUBSTRING(SUBSTRING_INDEX(mobile,',',a.id),CHAR_LENGTH(SUBSTRING_IND
EX(mobile,',',a.id-1))+1),',','') AS mobile-> FROM tb_sequence a-> CROSS JOIN(->   SELECT user_name,CONCAT(mobile,',') AS mobile,LENGTH(mobile)-LENGTH(REPLACE(mobile,',',''))
+1 size->   FROM user1_test-> ) b ON a.id <=b.size;
+-----------+-------------+
| user_name | mobile      |
+-----------+-------------+
| 孙悟空          | 12177778888 |
| 孙悟空          | 13944445555 |
| 孙悟空          | 16188885555 |
| 孙悟空          | 16188885555 |
| 沙僧        | 13822225555 |
| 沙僧        | 14177775555 |
| 唐僧         | 12112341234 |
| 唐僧         | 14112341234 |
| 唐僧         | 12112341234 |
| 猪八戒         | 18822225555 |
| 猪八戒         | 14188886666 |
+-----------+-------------+
11 rows in set (0.01 sec)-- 2、保留唯一数据-- 2-1 方法1
mysql>     SELECT id,user_name,mobile->     FROM (->           select b.id,user_name,REPLACE(SUBSTRING(SUBSTRING_INDEX(mobile,',',a.id),CHAR_LENGT
H(SUBSTRING_INDEX(mobile,',',a.id-1))+1),',','') AS mobile->           FROM tb_sequence a->           CROSS JOIN(->             SELECT id,user_name,CONCAT(mobile,',') AS mobile,LENGTH(mobile)-LENGTH(REPLACE(mo
bile,',',''))+1 size->             FROM user1_test->           ) b ON a.id <=b.size->         ) AA->     GROUP BY  id,user_name,mobile ;
+----+-----------+-------------+
| id | user_name | mobile      |
+----+-----------+-------------+
|  3 | 孙悟空          | 12177778888 |
|  3 | 孙悟空          | 13944445555 |
|  3 | 孙悟空          | 16188885555 |
|  4 | 沙僧        | 13822225555 |
|  4 | 沙僧        | 14177775555 |
|  8 | 唐僧         | 12112341234 |
|  8 | 唐僧         | 14112341234 |
|  9 | 猪八戒         | 14188886666 |
|  9 | 猪八戒         | 18822225555 |
+----+-----------+-------------+
9 rows in set (0.03 sec)-- 2-2 方法2mysql>         SELECT DISTINCT id,user_name,mobile->     FROM (->           select b.id,user_name,REPLACE(SUBSTRING(SUBSTRING_INDEX(mobile,',',a.id),CHAR_LENGT
H(SUBSTRING_INDEX(mobile,',',a.id-1))+1),',','') AS mobile->           FROM tb_sequence a->           CROSS JOIN(->             SELECT id,user_name,CONCAT(mobile,',') AS mobile,LENGTH(mobile)-LENGTH(REPLACE(mo
bile,',',''))+1 size->             FROM user1_test->           ) b ON a.id <=b.size->         ) AA-> ;
+----+-----------+-------------+
| id | user_name | mobile      |
+----+-----------+-------------+
|  3 | 孙悟空          | 12177778888 |
|  3 | 孙悟空          | 13944445555 |
|  3 | 孙悟空          | 16188885555 |
|  4 | 沙僧        | 13822225555 |
|  4 | 沙僧        | 14177775555 |
|  8 | 唐僧         | 12112341234 |
|  8 | 唐僧         | 14112341234 |
|  9 | 猪八戒         | 18822225555 |
|  9 | 猪八戒         | 14188886666 |
+----+-----------+-------------+
9 rows in set (0.02 sec)-- 3、行转列:连接mobile;
mysql>     SELECT id,user_name,GROUP_CONCAT(mobile) mobiles->     FROM(->         SELECT DISTINCT id,user_name,mobile->         FROM (->           select b.id,user_name,REPLACE(SUBSTRING(SUBSTRING_INDEX(mobile,',',a.id),CHAR_LENGT
H(SUBSTRING_INDEX(mobile,',',a.id-1))+1),',','') AS mobile->           FROM tb_sequence a->           CROSS JOIN(->             SELECT id,user_name,CONCAT(mobile,',') AS mobile,LENGTH(mobile)-LENGTH(REPLACE(mo
bile,',',''))+1 size->             FROM user1_test->           ) b ON a.id <=b.size->         ) AA->     )AB->     GROUP BY id,user_name-> ;
+----+-----------+-------------------------------------+
| id | user_name | mobiles                             |
+----+-----------+-------------------------------------+
|  3 | 孙悟空          | 16188885555,13944445555,12177778888 |
|  4 | 沙僧        | 14177775555,13822225555             |
|  8 | 唐僧         | 14112341234,12112341234             |
|  9 | 猪八戒         | 14188886666,18822225555             |
+----+-----------+-------------------------------------+
4 rows in set (0.02 sec)-- 4、更新。mysql> UPDATE  user1_test FA1-> LEFT JOIN (->     SELECT id,user_name,GROUP_CONCAT(mobile) mobiles->     FROM(->         SELECT DISTINCT id,user_name,mobile->         FROM (->           select b.id,user_name,REPLACE(SUBSTRING(SUBSTRING_INDEX(mobile,',',a.id),CHAR_LENGT
H(SUBSTRING_INDEX(mobile,',',a.id-1))+1),',','') AS mobile->           FROM tb_sequence a->           CROSS JOIN(->             SELECT id,user_name,CONCAT(mobile,',') AS mobile,LENGTH(mobile)-LENGTH(REPLACE(mo
bile,',',''))+1 size->             FROM user1_test->           ) b ON a.id <=b.size->         ) AA->     )AB->     GROUP BY id,user_name-> ) FA2 ON FA1.id = FA2.id-> SET FA1.mobile = FA2.mobiles-> WHERE FA1.mobile != FA2.mobiles;
Query OK, 4 rows affected (0.04 sec)
Rows matched: 4  Changed: 4  Warnings: 0mysql> select * from user1_test;
+----+-----------+------------+-------------------------------------+
| id | user_name | over       | mobile                              |
+----+-----------+------------+-------------------------------------+
|  3 | 孙悟空          | 斗战圣佛         | 16188885555,13944445555,12177778888 |
|  4 | 沙僧        | 金身罗汉          | 14177775555,13822225555             |
|  8 | 唐僧         | 旃檀功德佛         | 14112341234,12112341234             |
|  9 | 猪八戒         | 净坛使者         | 14188886666,18822225555             |
+----+-----------+------------+-------------------------------------+
4 rows in set (0.00 sec)

--开始的数据

mysql> select * from user1_test;
+----+-----------+------------+-------------------------------------------------+
| id | user_name | over       | mobile                                          |
+----+-----------+------------+-------------------------------------------------+
|  3 | 孙悟空          | 斗战圣佛         | 12177778888,13944445555,16188885555,16188885555 |
|  4 | 沙僧        | 金身罗汉          | 13822225555,14177775555                         |
|  8 | 唐僧         | 旃檀功德佛         | 12112341234,14112341234,12112341234             |
|  9 | 猪八戒         | 净坛使者         | 18822225555,14188886666                         |
+----+-----------+------------+-------------------------------------------------+

--最后的数据:重复去除,但是mobile的顺序变掉了。

mysql> select * from user1_test;
+----+-----------+------------+-------------------------------------+
| id | user_name | over       | mobile                              |
+----+-----------+------------+-------------------------------------+
|  3 | 孙悟空          | 斗战圣佛         | 16188885555,13944445555,12177778888 |
|  4 | 沙僧        | 金身罗汉          | 14177775555,13822225555             |
|  8 | 唐僧         | 旃檀功德佛         | 14112341234,12112341234             |
|  9 | 猪八戒         | 净坛使者         | 14188886666,18822225555             |
+----+-----------+------------+-------------------------------------+
4 rows in set (0.00 sec)

MySQL的开发技巧2相关推荐

  1. MySQL实战开发技巧

    29.设置自增起始值 alter table xxx AUTO_INCREMENT=1; 28.查询表字段,并转换,注意我的例子中,最后都以逗号结尾 SELECT concat ( COLUMN_NA ...

  2. 《大型数据库技术》MySQL的进阶开发技巧

    MySQL的进阶开发技巧 1.MySQL的存储过程 1.1 创建企业销售系统的数据库,命名为salesdb 1.2 创建一张商品销售表,命名为salerecords,包括如下字段:商品ID,商品名称, ...

  3. MySQL数据库开发规范-EC

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...

  4. MySQL 性能优化技巧

    原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...

  5. MySQL数据库优化技巧大全

    简介:MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行 ...

  6. 【MySQL】37 个 MySQL 数据库小技巧

    1.概述 转载:37 个 MySQL 数据库小技巧,不看别后悔! 无论是运维.开发.测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库.学MySQL,到底是要学习它的哪些东西呢? ...

  7. Go 学习笔记(83)— 编码规范及常用开发技巧

    UBER 开源的 Go 语言开发规范 1. 规范指南 1.1 包名 package 的命名应该遵循如下原则: 只由小写字母组成.不包含大写字母和下划线等字符: 简短并包含一定的上下文信息.例如 tim ...

  8. 基于搜狐云景的java语言开发技巧

    基于搜狐云景的java语言开发技巧 坊间盛传国内最牛X的paas公测了,上网搜了下,是搜狐云景,我试用了下,以下是我对搜狐云景的初体验,和辛苦耕耘的码农分享.在云景上开发java项目,和你现在的工作没 ...

  9. php mysql 网站实例教程,PHP+MYSQL网站开发全程实例

    . 从观念的引述.程序代码解析到范例的延伸应用,给您最完整的学习流程. 2. 实务网站范例,所有技术整合运用,实作技巧一览无遗. 3.在PHP的程序设计中,以高阶的程序设计,配上灵活的图解,增加您程序 ...

  10. PHP+MYSQL网站开发全程实例

    PHP+MYSQL网站开发全程实例课程介绍: 1. 从观念的引述.程序代码解析到范例的延伸应用,给您最完整的学习流程. 2. 实务网站范例,所有技术整合运用,实作技巧一览无遗. 3.在PHP的程序设计 ...

最新文章

  1. error code [17027]; 流已被关闭;
  2. 用SAXBuilder、Document、Element操作xml
  3. 重庆python培训-重庆Python培训班学完能做什么
  4. 【pmcaff】O2O的背后价值:数据将成为O2O真正核心
  5. SQL脚本:监控当前重做日志文件使用情况
  6. Tiniux 3.0 / Memory.c / OSMemInit
  7. ellipsis省略号表示多余内容
  8. 五大原则之----里氏替换原则(LSP)
  9. d3 canvas_D3和Canvas分3个步骤
  10. windows控件常用缩写
  11. HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)
  12. MYSQL主从复制操作文档
  13. 招商银行笔试题之X游戏
  14. android然后让list刷新到底部,Android笔记之:App列表之下拉刷新的使用
  15. 动态链接库(.dll) 动态导入库(.lib) 静态链接库(.lib)
  16. 做项目遇到的一些CSS问题
  17. 个人网站选择支付宝api
  18. XDOJ综合题 数字分解排序
  19. Asterisk[1]
  20. android脚本实现自动捉妖,一起来捉妖自动秒杀脚本下载-一起来捉妖自动秒杀辅助 最新版_爱下手机站...

热门文章

  1. cpu开机就是60℃_开机cpu温度60多度
  2. 如何利用Excel公式制作日历
  3. scratch编程一款节奏小游戏
  4. 定义结构体变量的三种方法
  5. 关于Google Chrome浏览器离线安装包下载方法
  6. XML 用户界面语言(XUL)开发简介
  7. wps公式如何加序号_WPS满满干货教程分享:你就是下一个职场大神
  8. Shifter - Responsive HTML5 高大上静态页面
  9. 使用R语言进行一元回归
  10. 你的短信接口真的安全吗?