環境はMySQL8.0, Rails6ですが、ActiveRecordの前にSQLを組み立てようとしています。
以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、イベントで販売する座席を登録しています。
また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、1対多の関係となります。
base_seatsテーブル
id | hall_id | name |
---|---|---|
1 | 1 | 1-1 |
2 | 1 | 1-2 |
3 | 1 | 1-3 |
4 | 1 | 1-4 |
5 | 2 | 1-1 |
6 | 2 | 1-2 |
7 | 2 | 1-3 |
seatsテーブル
id | event_id | base_seat_id | order_id |
---|---|---|---|
1 | 1 | 2 | 1 |
2 | 1 | 3 | NULL |
3 | 1 | 4 | 2 |
4 | 2 | 2 | 3 |
5 | 2 | 3 | 4 |
6 | 2 | 4 | NULL |
欲しい結果
base_seatsテーブルをhall_id=1で抽出、seatsテーブルをevent_id=1で抽出、両者をleft joinし、注文のついてない座席も取得します。それぞれのテーブルの件数が10万ほどあるので、抽出した結果でないと時間がかかってしまいます。
id | hall_id | name | base_seat_id | event_id | order_id |
---|---|---|---|---|---|
1 | 1 | 1-1 | NULL | NULL | NULL |
2 | 1 | 1-2 | 2 | 1 | 1 |
3 | 1 | 1-3 | 3 | 1 | NULL |
4 | 1 | 1-4 | 4 | 1 | 2 |
やってみたこと
以下2つのsqlをつくってみましたが、どれも30秒以上かかってしまうという結果でした。以下のものは両テーブルをそれぞれ抽出したものを結合するというようにはなっていないのですが、サブクエリ同士を結合するというやり方はWEB検索して見当たりませんでした。
sql
1 2SELECT b.*, s.* 3FROM base_seats AS b 4 5LEFT OUTER JOIN seats AS s 6ON b.id = s.base_seat_id AND s.event_id = 1 7 8WHERE b.hall_id = 1 9
sql
1SELECT b.*, c.* 2FROM base_seats AS b 3 4LEFT OUTER JOIN ( 5 SELECT * 6 FROM seats AS s 7 WHERE s.event_id = 1 ) AS c 8ON b.id = c.base_seat_id 9 10WHERE b.hall_id = 1
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/17 15:29
2019/10/17 15:55