MySQL函式FIND_IN_SET介紹
背景
前幾天面試遇見一個問題,如果一個表欄位對應另一個表多個欄位,問怎麼用一條SQL語句實現,因為沒有接觸過FIND_IN_SET,當時想了其他很多辦法都沒有有效解決,後來發現可以使用FIND_IN_SET函式實現。
準備工作
mysql> create table movie ( -> id int primary key auto_increment, -> name varchar(20), -> type varchar(20) -> ); Query OK, 0 rows affected (0.05 sec) mysql> create table movie_type( > id int primary key auto_increment, > type_name varchar(20), > type_desc varchar(255) > ); Query OK, 0 rows affected (0.04 sec) mysql> insert into movie values (null, '速度與激情','1,3,6'); Query OK, 1 row affected (0.03 sec) mysql> insert into movie values (null, '萬物生長','2,3,5'); Query OK, 1 row affected (0.00 sec) mysql> insert into movie values (null, '戰狼','1,3'); Query OK, 1 row affected (0.02 sec) mysql> insert into movie values (null, '星際迷航','10'); Query OK, 1 row affected (0.03 sec) mysql> insert into movie_type values(1,'動作','動作大片'),(2,'愛情','愛情片'),(3,'驚悚','驚悚片'),(4,'倫理','倫理片'),(5,'科幻','科幻片'); Query OK, 5 rows affected (0.03 sec) Records: 5 Duplicates: 0 Warnings: 0
試用FIND_IN_SET函式
mysql> select FIND_IN_SET('2','5,4,3,2,1'); +------------------------------+ | FIND_IN_SET('2','5,4,3,2,1') | +------------------------------+ | 4 | +------------------------------+ 1 row in set (0.00 sec) mysql> select * from movie where FIND_IN_SET(2,type); +----+--------------+-------+ | id | name | type | +----+--------------+-------+ | 2 | 萬物生長 | 2,3,5 | +----+--------------+-------+ 1 row in set (0.00 sec) mysql> select a.name,a.type, group_concat(b.type_name), group_concat(b.type_desc order by b.id desc SEPARATOR ' # ') as type_desc from movie a inner join movie_type b on FIND_IN_SET(b.id,a.type) group by a.id ; +-----------------+-------+---------------------------+-----------------------------------+ | name | type | group_concat(b.type_name) | type_desc | +-----------------+-------+---------------------------+-----------------------------------+ | 速度與激情 | 1,3,6 | 動作,驚悚 | 驚悚片 # 動作大片 | | 萬物生長 | 2,3,5 | 驚悚,愛情,科幻 | 科幻片 # 驚悚片 # 愛情片 | | 戰狼 | 1,3 | 動作,驚悚 | 驚悚片 # 動作大片 | +-----------------+-------+---------------------------+-----------------------------------+ 3 rows in set (0.00 sec) 當時想的正則匹配不能實現 mysql> select a.name,a.type, group_concat(b.type_name), group_concat(b.type_desc order by b.id desc SEPARATOR ' # ') as type_desc from movie a inner join movie_type b on a.type REGEXP b.id group by a.id ; +-----------------+-------+---------------------------+-----------------------------------+ | name | type | group_concat(b.type_name) | type_desc | +-----------------+-------+---------------------------+-----------------------------------+ | 速度與激情 | 1,3,6 | 動作,驚悚 | 驚悚片 # 動作大片 | | 萬物生長 | 2,3,5 | 驚悚,愛情,科幻 | 科幻片 # 驚悚片 # 愛情片 | | 戰狼 | 1,3 | 動作,驚悚 | 驚悚片 # 動作大片 | | 星際迷航 | 10 | 動作 | 動作大片 | +-----------------+-------+---------------------------+-----------------------------------+ 4 rows in set (0.00 sec)
可以看到正則匹配查詢匹配出的資料並不正確,順便複習了一下group_concat的使用方式。
整理自網路
Svoid
2015-04-24
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29733787/viewspace-1604394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql FIND_IN_SET函式、INSTR函式MySql函式
- mysql find_in_set()函式的使用MySql函式
- 相容MySQL中的find_in_set函式MySql函式
- ORACLE函式介紹Oracle函式
- TypeScript 函式介紹TypeScript函式
- stoi函式介紹函式
- oracle常用函式介紹Oracle函式
- 機器學習基本函式介紹機器學習函式
- replaceChild()函式用法介紹函式
- lpad函式介紹函式
- oracle REPLACE 函式 介紹Oracle函式
- oracle 日期函式介紹Oracle函式
- CUDA常用函式介紹函式
- Trim() 函式的介紹函式
- GCD、dispatch 函式介紹GC函式
- cuda函式庫介紹函式
- 【函式】Oracle TRIM函式語法介紹函式Oracle
- MySQL之儲存函式詳細介紹艹籟MySql儲存函式
- 函式表示式和函式宣告簡單介紹函式
- 使用find_in_set()函式的注意事項函式
- MySQL5.6中的常用函式詳細用法介紹MySql函式
- Dart建構函式介紹Dart函式
- javascript函式中with的介紹JavaScript函式
- funclib函式庫介紹函式
- 網路常用函式介紹函式
- Oracle 的基本函式介紹Oracle函式
- prototype.js函式介紹JS函式
- Signal ()函式詳細介紹 Linux函式函式Linux
- ORACLE函式介紹第三篇 著名函式之聚合函式Oracle函式
- ORACLE函式介紹第六篇 著名函式之分析函式Oracle函式
- 原創:oracle聚合函式介紹Oracle函式
- ES6 Generator 函式介紹函式
- 快速介紹幾個JS函式JS函式
- javascript高階函式的介紹JavaScript函式
- javascript中generator函式的介紹JavaScript函式
- js lastIndexOf()函式的用法介紹JSASTIndex函式
- javascript的split()函式使用介紹JavaScript函式
- javascript匿名函式簡單介紹JavaScript函式