MySQL

外部キーがカンマ区切りテキストなテーブルにJOINする

More than 3 years have passed since last update.

チェックリストを作るなどの目的で、複数のテーブルをJOINしてSELECTした結果が欲しい時があります。が、データベースの設計がちょっと残念で、多対多の関連で外部キーが親テーブルのカラムにカンマ区切りのテキストで入っていたりする場合があります。

普通ならもうSQLだけではどうにもなりませんが、MySQLならFIND_IN_SET()関数を使うことでJOINできます。

以下の例ではbookが親テーブルで、authorが子テーブル、authorsカラムにauthorテーブルのキーがカンマ区切りで入っている想定です。

SELECT * FORM book JOIN auther IN FIND_IN_SET(author.id, book.authors) >= 1

FIND_IN_SET(str,strlist) 関数は、strlistをカンマ区切りの値として解釈して、strで指定した値が何番目にあるのかを返す関数です。たとえばFIND_IN_SET(5, '1,3,5,7,11') なら3が返ります。見つからなかった場合はNULLを返します。

bookテーブル1行に対してauthorテーブルのauthorsカラムにキーが含まれる行が選択されてくるのでJOIN出来るわけです。

ちなみにbookテーブルの行数×authorテーブルの行数分だけスキャンが走るはずなので猛烈に遅いはずです。