10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

チェックリストを作るなどの目的で、複数のテーブルを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テーブルの行数分だけスキャンが走るはずなので猛烈に遅いはずです。

10
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?