MySQL的开发技巧2
参考:
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相关推荐
- MySQL实战开发技巧
29.设置自增起始值 alter table xxx AUTO_INCREMENT=1; 28.查询表字段,并转换,注意我的例子中,最后都以逗号结尾 SELECT concat ( COLUMN_NA ...
- 《大型数据库技术》MySQL的进阶开发技巧
MySQL的进阶开发技巧 1.MySQL的存储过程 1.1 创建企业销售系统的数据库,命名为salesdb 1.2 创建一张商品销售表,命名为salerecords,包括如下字段:商品ID,商品名称, ...
- MySQL数据库开发规范-EC
最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...
- MySQL 性能优化技巧
原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...
- MySQL数据库优化技巧大全
简介:MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行 ...
- 【MySQL】37 个 MySQL 数据库小技巧
1.概述 转载:37 个 MySQL 数据库小技巧,不看别后悔! 无论是运维.开发.测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库.学MySQL,到底是要学习它的哪些东西呢? ...
- Go 学习笔记(83)— 编码规范及常用开发技巧
UBER 开源的 Go 语言开发规范 1. 规范指南 1.1 包名 package 的命名应该遵循如下原则: 只由小写字母组成.不包含大写字母和下划线等字符: 简短并包含一定的上下文信息.例如 tim ...
- 基于搜狐云景的java语言开发技巧
基于搜狐云景的java语言开发技巧 坊间盛传国内最牛X的paas公测了,上网搜了下,是搜狐云景,我试用了下,以下是我对搜狐云景的初体验,和辛苦耕耘的码农分享.在云景上开发java项目,和你现在的工作没 ...
- php mysql 网站实例教程,PHP+MYSQL网站开发全程实例
. 从观念的引述.程序代码解析到范例的延伸应用,给您最完整的学习流程. 2. 实务网站范例,所有技术整合运用,实作技巧一览无遗. 3.在PHP的程序设计中,以高阶的程序设计,配上灵活的图解,增加您程序 ...
- PHP+MYSQL网站开发全程实例
PHP+MYSQL网站开发全程实例课程介绍: 1. 从观念的引述.程序代码解析到范例的延伸应用,给您最完整的学习流程. 2. 实务网站范例,所有技术整合运用,实作技巧一览无遗. 3.在PHP的程序设计 ...
最新文章
- error code [17027]; 流已被关闭;
- 用SAXBuilder、Document、Element操作xml
- 重庆python培训-重庆Python培训班学完能做什么
- 【pmcaff】O2O的背后价值:数据将成为O2O真正核心
- SQL脚本:监控当前重做日志文件使用情况
- Tiniux 3.0 / Memory.c / OSMemInit
- ellipsis省略号表示多余内容
- 五大原则之----里氏替换原则(LSP)
- d3 canvas_D3和Canvas分3个步骤
- windows控件常用缩写
- HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)
- MYSQL主从复制操作文档
- 招商银行笔试题之X游戏
- android然后让list刷新到底部,Android笔记之:App列表之下拉刷新的使用
- 动态链接库(.dll) 动态导入库(.lib) 静态链接库(.lib)
- 做项目遇到的一些CSS问题
- 个人网站选择支付宝api
- XDOJ综合题 数字分解排序
- Asterisk[1]
- android脚本实现自动捉妖,一起来捉妖自动秒杀脚本下载-一起来捉妖自动秒杀辅助 最新版_爱下手机站...