質問編集履歴

7

修正

2019/10/17 15:25

投稿

orori
orori

スコア42

test CHANGED
File without changes
test CHANGED
@@ -96,19 +96,19 @@
96
96
 
97
97
 
98
98
 
99
- SELECT b.`*`, s.*
99
+ SELECT b.*, s.*
100
100
 
101
- FROM `base_seats` AS b
101
+ FROM base_seats AS b
102
102
 
103
103
 
104
104
 
105
105
  LEFT OUTER JOIN seats AS s
106
106
 
107
- ON b.id = s.base_seat_id AND s.event_id = 20
107
+ ON b.id = s.base_seat_id AND s.event_id = 1
108
108
 
109
109
 
110
110
 
111
- WHERE b.`hall_id` = 16
111
+ WHERE b.hall_id = 1
112
112
 
113
113
 
114
114
 
@@ -118,9 +118,9 @@
118
118
 
119
119
  ```sql
120
120
 
121
- SELECT b.`*`, c.*
121
+ SELECT b.*, c.*
122
122
 
123
- FROM `base_seats` AS b
123
+ FROM base_seats AS b
124
124
 
125
125
 
126
126
 
@@ -130,13 +130,13 @@
130
130
 
131
131
  FROM seats AS s
132
132
 
133
- WHERE s.event_id = 20 ) AS c
133
+ WHERE s.event_id = 1 ) AS c
134
134
 
135
- ON b.`id` = c.`base_seat_id`
135
+ ON b.id = c.base_seat_id
136
136
 
137
137
 
138
138
 
139
- WHERE b.`hall_id` = 16
139
+ WHERE b.hall_id = 1
140
140
 
141
141
  ```
142
142
 

6

わかりやすくした

2019/10/17 15:25

投稿

orori
orori

スコア42

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけを登録しています。
5
+ 以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、イベントで販売する座席を登録しています。
6
6
 
7
7
 
8
8
 

5

わかりやすくした

2019/10/17 13:57

投稿

orori
orori

スコア42

test CHANGED
File without changes
test CHANGED
@@ -2,19 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- 以下のような2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
6
-
7
- seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけ登録しています。
5
+ 以下2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)などの基本情報を、seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけ登録しています。
8
6
 
9
7
 
10
8
 
11
- また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、
9
+ また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、1対多の関係となります。
12
-
13
- 1対多の関係となります。
14
10
 
15
11
 
16
-
17
- ```
18
12
 
19
13
  base_seatsテーブル
20
14
 
@@ -38,11 +32,7 @@
38
32
 
39
33
  |7 | 2| 1-3|
40
34
 
41
- ```
42
35
 
43
-
44
-
45
- ```
46
36
 
47
37
  seatsテーブル
48
38
 
@@ -66,47 +56,37 @@
66
56
 
67
57
 
68
58
 
69
- ```
59
+
70
60
 
71
61
  # 欲しい結果
72
62
 
73
63
 
74
64
 
75
- base_seatsテーブルをhall_id=1で抽出、seatsテーブルをevent_id=1で抽出し、
65
+ base_seatsテーブルをhall_id=1で抽出、seatsテーブルをevent_id=1で抽出、両者をleft joinし、注文のついてない座席も取得します。それぞれのテーブルの件数が10万ほどあるので、抽出した結果でないと時間がかかってしまいます。
76
-
77
- base_seatsからseatsをleft joinし、注文のついてない座席も取得します。
78
-
79
-
80
-
81
- |id | hall_id| name|event_id|order_id|
82
-
83
- |---|--------|-----|--------|--------|
84
-
85
- |1 | 1| 1-1| NULL| NULL|
86
-
87
- |2 | 1| 1-2| 2| 1|
88
-
89
- |3 | 1| 1-3| 3| NULL|
90
-
91
- |4 | 1| 1-4| 4| 2|
92
66
 
93
67
 
94
68
 
95
69
 
96
70
 
97
- それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
71
+ |id | hall_id| name|base_seat_id|event_id|order_id|
98
72
 
99
- また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
73
+ |---|--------|-----|------------|--------|--------|
74
+
75
+ |1 | 1| 1-1| NULL| NULL| NULL|
76
+
77
+ |2 | 1| 1-2| 2| 1| 1|
78
+
79
+ |3 | 1| 1-3| 3| 1| NULL|
80
+
81
+ |4 | 1| 1-4| 4| 1| 2|
82
+
83
+
100
84
 
101
85
 
102
86
 
103
87
  # やってみたこと
104
88
 
105
- 以下2つのsqlをつくってみましたが、どれも30秒以上かかってしまうという結果でした。
106
-
107
- 以下のものは両テーブルをそれぞれ抽出したものを結合するというようにはなっていないのですが、
89
+ 以下2つsqlをつくってみましたが、どれ30秒以上かかってしまうという結果でした。以下ものは両テーブルをそれぞれ抽出したものを結合するというようにはなっていないのですが、サブクエリ同士を結合するというやり方はWEB検索して見当たりませんでした。
108
-
109
- サブクエリ同士を結合するというやり方はWEB検索して見当たりませんでした。
110
90
 
111
91
 
112
92
 

4

質問をよりわかりやすくした

2019/10/17 12:57

投稿

orori
orori

スコア42

test CHANGED
File without changes
test CHANGED
@@ -68,11 +68,33 @@
68
68
 
69
69
  ```
70
70
 
71
- # やりたこと
71
+ # 欲し結果
72
72
 
73
- base_seatsテーブルから、seatsテーブルをLEFT JOINし、注文のついていない座席も取得したいです。
74
73
 
74
+
75
+ base_seatsテーブルをhall_id=1で抽出し、seatsテーブルをevent_id=1で抽出し、
76
+
77
+ base_seatsからseatsをleft joinし、注文のついてない座席も取得します。
78
+
79
+
80
+
81
+ |id | hall_id| name|event_id|order_id|
82
+
83
+ |---|--------|-----|--------|--------|
84
+
85
+ |1 | 1| 1-1| NULL| NULL|
86
+
87
+ |2 | 1| 1-2| 2| 1|
88
+
89
+ |3 | 1| 1-3| 3| NULL|
90
+
91
+ |4 | 1| 1-4| 4| 2|
92
+
93
+
94
+
95
+
96
+
75
- ただし、それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
97
+ それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
76
98
 
77
99
  また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
78
100
 

3

改善

2019/10/17 12:46

投稿

orori
orori

スコア42

test CHANGED
File without changes
test CHANGED
@@ -1,22 +1,16 @@
1
- チケットを販売するWEBサイトを予定しています。
2
-
3
1
  環境はMySQL8.0, Rails6ですが、ActiveRecordの前にSQLを組み立てようとしています。
4
2
 
5
3
 
6
4
 
7
- 以下、単純化しましたが、以下のような2つのテーブルがあります。
5
+ 以下のような2つのテーブルがあります。base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
8
6
 
9
- base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を、
10
-
11
- seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく販売する座席だけ登録しています。
7
+ seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく座席だけ登録しています。
12
8
 
13
9
 
14
10
 
15
- また、base_seatは同じ会場で複数のイベントを開催することになるので、
11
+ また、base_seatは同じ座席で複数のイベントを開催することになるので、base_seatモデルとseatモデルは、
16
12
 
17
- base_seatモデルとseatモデルは、1対多の関係となります。
13
+ 1対多の関係となります。
18
-
19
-
20
14
 
21
15
 
22
16
 
@@ -78,9 +72,9 @@
78
72
 
79
73
  base_seatsテーブルから、seatsテーブルをLEFT JOINし、注文のついていない座席も取得したいです。
80
74
 
81
- ただし、それぞれのテーブルの件数が10万ほどあるので、base_seatsは、hall_idで抽出し、
75
+ ただし、それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
82
76
 
83
- また結合先のseatsテーブルは、event_idで抽出しないと、表示に時間がかかってしまいます。
77
+ また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
84
78
 
85
79
 
86
80
 

2

文章の改善

2019/10/17 12:39

投稿

orori
orori

スコア42

test CHANGED
@@ -1 +1 @@
1
- # 抽出したテーブル同士を結合するやり方
1
+ # 抽出したテーブル同士をLEFT JOINするやり方
test CHANGED
@@ -6,17 +6,15 @@
6
6
 
7
7
  以下、単純化しましたが、以下のような2つのテーブルがあります。
8
8
 
9
- base_seatsテーブルでは、会場(hall)にある全座席の縦横の位置情報など
9
+ base_seatsテーブルでは、会場(hall)にある全座席の名前(name)を
10
10
 
11
- seatsテーブルでは、このbase_seatsテーブルの中から注文などが紐づく販売する座席登録しています。
11
+ seatsテーブルでは、このbase_seatsテーブルをベースに、その中から注文が紐づく販売する座席だけ登録しています。
12
12
 
13
13
 
14
14
 
15
- また、base_seatをベースに、複数のイベントを開催するので、
15
+ また、base_seatは同じ会場で複数のイベントを開催することになるので、
16
16
 
17
17
  base_seatモデルとseatモデルは、1対多の関係となります。
18
-
19
-
20
18
 
21
19
 
22
20
 
@@ -28,7 +26,7 @@
28
26
 
29
27
 
30
28
 
31
- |id | hall_id|place|
29
+ |id | hall_id| name|
32
30
 
33
31
  |---|--------|-----|
34
32
 

1

間違い修正

2019/10/17 12:33

投稿

orori
orori

スコア42

test CHANGED
File without changes
test CHANGED
@@ -114,7 +114,7 @@
114
114
 
115
115
 
116
116
 
117
- WHERE b.`place_id` = 16
117
+ WHERE b.`hall_id` = 16
118
118
 
119
119
 
120
120
 
@@ -142,7 +142,7 @@
142
142
 
143
143
 
144
144
 
145
- WHERE b.`place_id` = 16
145
+ WHERE b.`hall_id` = 16
146
146
 
147
147
  ```
148
148