1対多 関係から多の結果を1レコード別カラムに返すSQL(上限有り前提)
- select結果を普通縦にレコードが伸びますが横に伸ばしたいときに利用できます。
- crosstabとか利用するのが面倒なときにエイヤッと書けます。
テーブル例
- 1:membersテーブル
- 多:member_hobbies テーブル
- 1人が複数の趣味を持っている
返したい結果表
SQL (どちらも同じ結果が返ります)
シンプルSQL
- 伸ばしたいカラム数分、SELECT句に副問合せを記述
select
( SELECT member_hobbies.name
FROM member_hobbies
WHERE member_hobbies.fda_member_id = fda_members.id
ORDER BY member_hobbies.id
OFFSET 0
LIMIT 1 ) AS hobby_1,
( SELECT member_hobbies.name
FROM member_hobbies
WHERE member_hobbies.fda_member_id = fda_members.id
ORDER BY member_hobbies.id
OFFSET 1
LIMIT 1) AS hobby_2,
( SELECT member_hobbies.name
FROM member_hobbies
WHERE member_hobbies.fda_member_id = fda_members.id
ORDER BY member_hobbies.id
OFFSET 2
LIMIT 1) AS hobby_3,
( SELECT member_hobbies.name
FROM member_hobbies
WHERE member_hobbies.fda_member_id = fda_members.id
ORDER BY member_hobbies.id
OFFSET 3
LIMIT 1) AS hobby_4,
*
FROM
members
配列利用SQL
- FROM句にて副問合せで、人ごとに趣味を配列化して保持する
- 伸ばしたいカラム数分、SELECT句に配列を指定する
--SQLがすっきりする。
--副問合せが一回で済み速度も速くなる可能性有り
--WHERE句が書きやすい
--SELECT句に指定が必要
select
hobby[1] as hobby1,
hobby[2] as hobby2,
hobby[3] as hobby3,
hobby[4] as hobby4,
hoge.*
FROM
(
select
*,
(
select ARRAY ( select name FROM member_hobbies where fda_member_id = members.id ORDER BY id)
) as hobby
FROM
members
) as hoge


