裏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と違って変な変換候補でますよね。おもろいのでそのままにしてみました。