MySQL的開發技巧2
參考:
1、 MySQL開發技巧
2、 MySQL開發技巧2
行轉列
利用序列表處理行轉列的資料
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: 0 mysql> 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: 0 mysql> update user1 set mobile='13822225555,14177775555' where id=4; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> 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 specified INSERT 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=3 then 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: 0
mysql> 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: 0
mysql> 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: 0
mysql> 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 id
FROM user1_test
GROUP BY user_name
HAVING 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: 0
mysql> 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: 0
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 |
+----+-----------+------------+-------------------------------------------------+
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 方法2
mysql> 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: 0
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> 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)