裏MySQLクエリー入門(12) 基礎編9 FIND_IN_SET
先週は、仕事で燃え尽きて萌えかす*1程の気力しか残っていなかったIT7Cです。今日はMySQLの文字列関数FIND_IN_SETについて紹介したいと思います。FIND_IN_SETは、カンマ区切りの文字列から任意の文字列を取り出す、GROUP_CONCATの逆の関数みたいなものです。
- FIND_IN_SET(str,strlist)
N 個の部分文字列で構成されるリスト strlist に、文字列 str が含まれている場合は、1 から N までのいずれかの値を返す。文字列のリストは、それぞれの間を ‘,’ 文字で区切られた各部分文字列で構成される文字列である。最初の引数が定数文字列で、2 番目の引数が SET 型のカラムの場合、FIND_IN_SET() 関数はビット演算を使用するよう最適化される。 str が strlist に含まれていない場合や、strlist が空の文字列の場合は、0 を返す。どちらの引数も NULL の場合は、NULL を返す。 最初の引数にカンマ ‘,’ が含まれていると、この関数は正しく動作しない。
SELECT FIND_IN_SET('b','a,b,c,d');
2
まずは例題用のデータ作りから
CREATE TABLE `platform` ( `platform_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'プラットフォームID', `platform_name` VARCHAR( 255 ) NOT NULL COMMENT 'プラットフォーム名', `program_ids` VARCHAR( 255 ) NOT NULL COMMENT 'プログラム' ) ENGINE = MYISAM COMMENT = 'プラットフォーム'; CREATE TABLE `program` ( `program_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'プログラムID', `program_name` VARCHAR( 255 ) NOT NULL COMMENT 'プログラミング言語名' ) ENGINE = MYISAM COMMENT = 'プログラミング言語'; INSERT INTO `program` (`program_name`) VALUES ('JAVA'),('ActionScript'),('PHP'),('Objective-C') INSERT INTO `platform` (`platform_name`,`program_ids`) VALUES ('Windows' ,'1,2,3') ,('Linux' ,'1,2,3') ,('Mac OS X','1,2,3,4'), ('iphone' ,'4') ,('Android' ,'1,2')
program_id | program_name |
---|---|
1 | JAVA |
2 | ActionScript |
3 | PHP |
4 | Objective-C |
platform_id | platform_name | program_ids |
---|---|---|
1 | Windows | 1,2,3 |
2 | Linux | 1,2,3 |
3 | Mac OS X | 1,2,3,4 |
4 | iphone | 4 |
5 | Android | 1,2 |
SELECT * FROM `platform` pf, `program` pg WHERE FIND_IN_SET( pg.program_id, pf.program_ids ) >0
platform_id | platform_name | program_ids | program_id | program_name |
---|---|---|---|---|
1 | Windows | 1,2,3 | 1 | JAVA |
1 | Windows | 1,2,3 | 2 | ActionScript |
1 | Windows | 1,2,3 | 3 | PHP |
2 | Linux | 1,2,3 | 1 | JAVA |
2 | Linux | 1,2,3 | 2 | ActionScript |
2 | Linux | 1,2,3 | 3 | PHP |
3 | Mac OS X | 1,2,3,4 | 1 | JAVA |
3 | Mac OS X | 1,2,3,4 | 2 | ActionScript |
3 | Mac OS X | 1,2,3,4 | 3 | PHP |
3 | Mac OS X | 1,2,3,4 | 4 | Objective-C |
4 | iphone | 4 | 4 | Objective-C |
5 | Android | 1,2 | 1 | JAVA |
5 | Android | 1,2 | 2 | ActionScript |
*1:google IMEって他のIMEと違って変な変換候補でますよね。おもろいのでそのままにしてみました。