質問編集履歴
7
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -47,27 +47,27 @@
|
|
47
47
|
|
48
48
|
```sql
|
49
49
|
|
50
|
-
SELECT b.
|
50
|
+
SELECT b.*, s.*
|
51
|
-
FROM
|
51
|
+
FROM base_seats AS b
|
52
52
|
|
53
53
|
LEFT OUTER JOIN seats AS s
|
54
|
-
ON b.id = s.base_seat_id AND s.event_id =
|
54
|
+
ON b.id = s.base_seat_id AND s.event_id = 1
|
55
55
|
|
56
|
-
WHERE b.
|
56
|
+
WHERE b.hall_id = 1
|
57
57
|
|
58
58
|
```
|
59
59
|
|
60
60
|
```sql
|
61
|
-
SELECT b.
|
61
|
+
SELECT b.*, c.*
|
62
|
-
FROM
|
62
|
+
FROM base_seats AS b
|
63
63
|
|
64
64
|
LEFT OUTER JOIN (
|
65
65
|
SELECT *
|
66
66
|
FROM seats AS s
|
67
|
-
WHERE s.event_id =
|
67
|
+
WHERE s.event_id = 1 ) AS c
|
68
|
-
ON b.
|
68
|
+
ON b.id = c.base_seat_id
|
69
69
|
|
70
|
-
WHERE b.
|
70
|
+
WHERE b.hall_id = 1
|
71
71
|
```
|
72
72
|
|
73
73
|
|
6
わかりやすくした
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
環境はMySQL8.0, Rails6ですが、ActiveRecordの前にSQLを組み立てようとしています。
|
2
2
|
|
3
|
-
以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、
|
3
|
+
以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、イベントで販売する座席を登録しています。
|
4
4
|
|
5
5
|
また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、1対多の関係となります。
|
6
6
|
|
5
わかりやすくした
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
環境はMySQL8.0, Rails6ですが、ActiveRecordの前にSQLを組み立てようとしています。
|
2
2
|
|
3
|
-
以下のような2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
|
4
|
-
seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけ登録しています。
|
3
|
+
以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけを登録しています。
|
5
4
|
|
6
|
-
また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、
|
5
|
+
また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、1対多の関係となります。
|
7
|
-
1対多の関係となります。
|
8
6
|
|
9
|
-
```
|
10
7
|
base_seatsテーブル
|
11
8
|
|
12
9
|
|id | hall_id| name|
|
@@ -18,9 +15,7 @@
|
|
18
15
|
|5 | 2| 1-1|
|
19
16
|
|6 | 2| 1-2|
|
20
17
|
|7 | 2| 1-3|
|
21
|
-
```
|
22
18
|
|
23
|
-
```
|
24
19
|
seatsテーブル
|
25
20
|
|
26
21
|
|id |event_id|base_seat_id|order_id|
|
@@ -32,27 +27,22 @@
|
|
32
27
|
|5 | 2| 3| 4|
|
33
28
|
|6 | 2| 4| NULL|
|
34
29
|
|
35
|
-
|
30
|
+
|
36
31
|
# 欲しい結果
|
37
32
|
|
38
|
-
base_seatsテーブルをhall_id=1で抽出
|
33
|
+
base_seatsテーブルをhall_id=1で抽出、seatsテーブルをevent_id=1で抽出、両者をleft joinし、注文のついてない座席も取得します。それぞれのテーブルの件数が10万ほどあるので、抽出した結果でないと時間がかかってしまいます。
|
39
|
-
base_seatsからseatsをleft joinし、注文のついてない座席も取得します。
|
40
34
|
|
41
|
-
|id | hall_id| name|event_id|order_id|
|
42
|
-
|---|--------|-----|--------|--------|
|
43
|
-
|1 | 1| 1-1| NULL| NULL|
|
44
|
-
|2 | 1| 1-2| 2| 1|
|
45
|
-
|3 | 1| 1-3| 3| NULL|
|
46
|
-
|4 | 1| 1-4| 4| 2|
|
47
35
|
|
36
|
+
|id | hall_id| name|base_seat_id|event_id|order_id|
|
37
|
+
|---|--------|-----|------------|--------|--------|
|
38
|
+
|1 | 1| 1-1| NULL| NULL| NULL|
|
39
|
+
|2 | 1| 1-2| 2| 1| 1|
|
40
|
+
|3 | 1| 1-3| 3| 1| NULL|
|
41
|
+
|4 | 1| 1-4| 4| 1| 2|
|
48
42
|
|
49
|
-
それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
|
50
|
-
また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
|
51
43
|
|
52
44
|
# やってみたこと
|
53
|
-
以下2つのsqlをつくってみましたが、どれも30秒以上かかってしまうという結果でした。
|
54
|
-
以下のものは両テーブルをそれぞれ抽出したものを結合するというようにはなっていないのですが、
|
45
|
+
以下2つのsqlをつくってみましたが、どれも30秒以上かかってしまうという結果でした。以下のものは両テーブルをそれぞれ抽出したものを結合するというようにはなっていないのですが、サブクエリ同士を結合するというやり方はWEB検索して見当たりませんでした。
|
55
|
-
サブクエリ同士を結合するというやり方はWEB検索して見当たりませんでした。
|
56
46
|
|
57
47
|
|
58
48
|
```sql
|
4
質問をよりわかりやすくした
title
CHANGED
File without changes
|
body
CHANGED
@@ -33,9 +33,20 @@
|
|
33
33
|
|6 | 2| 4| NULL|
|
34
34
|
|
35
35
|
```
|
36
|
-
#
|
36
|
+
# 欲しい結果
|
37
|
+
|
38
|
+
base_seatsテーブルをhall_id=1で抽出し、seatsテーブルをevent_id=1で抽出し、
|
37
|
-
base_seats
|
39
|
+
base_seatsからseatsをleft joinし、注文のついてない座席も取得します。
|
40
|
+
|
41
|
+
|id | hall_id| name|event_id|order_id|
|
42
|
+
|---|--------|-----|--------|--------|
|
43
|
+
|1 | 1| 1-1| NULL| NULL|
|
44
|
+
|2 | 1| 1-2| 2| 1|
|
45
|
+
|3 | 1| 1-3| 3| NULL|
|
46
|
+
|4 | 1| 1-4| 4| 2|
|
47
|
+
|
48
|
+
|
38
|
-
|
49
|
+
それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
|
39
50
|
また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
|
40
51
|
|
41
52
|
# やってみたこと
|
3
改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,14 +1,11 @@
|
|
1
|
-
チケットを販売するWEBサイトを予定しています。
|
2
1
|
環境はMySQL8.0, Rails6ですが、ActiveRecordの前にSQLを組み立てようとしています。
|
3
2
|
|
4
|
-
以下、単純化しましたが、以下のような2つのテーブルがあります。
|
5
|
-
base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
|
3
|
+
以下のような2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
|
6
|
-
seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく
|
4
|
+
seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけ登録しています。
|
7
5
|
|
8
|
-
また、base_seatは同じ
|
6
|
+
また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、
|
9
|
-
|
7
|
+
1対多の関係となります。
|
10
8
|
|
11
|
-
|
12
9
|
```
|
13
10
|
base_seatsテーブル
|
14
11
|
|
@@ -38,8 +35,8 @@
|
|
38
35
|
```
|
39
36
|
# やりたいこと
|
40
37
|
base_seatsテーブルから、seatsテーブルをLEFT JOINし、注文のついていない座席も取得したいです。
|
41
|
-
ただし、それぞれのテーブルの件数が10万ほどあるので、base_seatsは、hall_idで抽出し、
|
38
|
+
ただし、それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
|
42
|
-
また結合先のseatsテーブルは、event_idで抽出しないと、
|
39
|
+
また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
|
43
40
|
|
44
41
|
# やってみたこと
|
45
42
|
以下2つのsqlをつくってみましたが、どれも30秒以上かかってしまうという結果でした。
|
2
文章の改善
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
# 抽出したテーブル同士を
|
1
|
+
# 抽出したテーブル同士をLEFT JOINするやり方
|
body
CHANGED
@@ -2,18 +2,17 @@
|
|
2
2
|
環境はMySQL8.0, Rails6ですが、ActiveRecordの前にSQLを組み立てようとしています。
|
3
3
|
|
4
4
|
以下、単純化しましたが、以下のような2つのテーブルがあります。
|
5
|
-
base_seatsテーブルでは、会場(hall)にある全座席の
|
5
|
+
base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
|
6
|
-
seatsテーブルでは、このbase_seatsテーブルの中から
|
6
|
+
seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく販売する座席だけ登録しています。
|
7
7
|
|
8
|
-
また、base_seat
|
8
|
+
また、base_seatは同じ会場で複数のイベントを開催することになるので、
|
9
9
|
base_seatモデルとseatモデルは、1対多の関係となります。
|
10
10
|
|
11
11
|
|
12
|
-
|
13
12
|
```
|
14
13
|
base_seatsテーブル
|
15
14
|
|
16
|
-
|id | hall_id|
|
15
|
+
|id | hall_id| name|
|
17
16
|
|---|--------|-----|
|
18
17
|
|1 | 1| 1-1|
|
19
18
|
|2 | 1| 1-2|
|
1
間違い修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
LEFT OUTER JOIN seats AS s
|
57
57
|
ON b.id = s.base_seat_id AND s.event_id = 20
|
58
58
|
|
59
|
-
WHERE b.`
|
59
|
+
WHERE b.`hall_id` = 16
|
60
60
|
|
61
61
|
```
|
62
62
|
|
@@ -70,7 +70,7 @@
|
|
70
70
|
WHERE s.event_id = 20 ) AS c
|
71
71
|
ON b.`id` = c.`base_seat_id`
|
72
72
|
|
73
|
-
WHERE b.`
|
73
|
+
WHERE b.`hall_id` = 16
|
74
74
|
```
|
75
75
|
|
76
76
|
|