兄弟データを一回のSQLで取得する方法
DBのテーブルが親子関係にある時に、
あるデータの親データや子データを持ってくるのはSQLの基本です。
例えば親テーブルfamilies(科)のデータが
id | name |
1 | ネコ科 |
2 | イヌ科 |
3 | クマ科 |
子テーブルspecies(種)のデータが
id | name | scientific_name | family_id |
1 | イエネコ | Felis catus | 1 |
2 | オオカミ | Canis lupus | 2 |
3 | ヒグマ | Ursus arctos | 3 |
4 | ホッキョクグマ | Ursus maritimus | 3 |
5 | ジャイアントパンダ | Ailuropoda melanoleuca | 3 |
とあったときに、子データ『イエネコ』をキーに親データの科を調べようと思ったら
SELECT * FROM families WHERE id = (
SELECT family_id FROM species WHERE name = "イエネコ"
)
逆に親データ『イヌ科』をキーに子データを全取得しようと思ったら
SELECT * FROM species WHERE family_id = (
SELECT id FROM families WHERE name = "イヌ科"
)
ですよね。
では、例えば『ジャイアントパンダ』をキーに兄弟データであるヒグマやホッキョクグマのデータを持ってくるにはどうしたらいいでしょうか?
一回親データを検索してから子データを取ればいいんですけど、それだとSQLの呼び出し回数が二回になってしまうので、一回で呼びたい場合は?
……まあ、前の二つを見れば勘のいい方はすぐ気づくやつですけど。
SELECT * FROM species WHERE family_id = (
SELECT family_id FROM species WHERE name = "ジャイアントパンダ"
)
親テーブルのIDを使いながら、親テーブルを見に行く必要はないわけですね。
これぐらい単純なテーブル構造だと「だから何だ」って言われそうですが、多数のテーブルを遡ってまた下って、みたいな構造のとき、ちょっとだけショートカットできてお得です。