teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

修正

2019/10/17 15:25

投稿

orori
orori

スコア42

title CHANGED
File without changes
body CHANGED
@@ -47,27 +47,27 @@
47
47
 
48
48
  ```sql
49
49
 
50
- SELECT b.`*`, s.*
50
+ SELECT b.*, s.*
51
- FROM `base_seats` AS b
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 = 20
54
+ ON b.id = s.base_seat_id AND s.event_id = 1
55
55
 
56
- WHERE b.`hall_id` = 16
56
+ WHERE b.hall_id = 1
57
57
 
58
58
  ```
59
59
 
60
60
  ```sql
61
- SELECT b.`*`, c.*
61
+ SELECT b.*, c.*
62
- FROM `base_seats` AS b
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 = 20 ) AS c
67
+ WHERE s.event_id = 1 ) AS c
68
- ON b.`id` = c.`base_seat_id`
68
+ ON b.id = c.base_seat_id
69
69
 
70
- WHERE b.`hall_id` = 16
70
+ WHERE b.hall_id = 1
71
71
  ```
72
72
 
73
73
 

6

わかりやすくした

2019/10/17 15:25

投稿

orori
orori

スコア42

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

わかりやすくした

2019/10/17 13:57

投稿

orori
orori

スコア42

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で抽出、seatsテーブルをevent_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

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

2019/10/17 12:57

投稿

orori
orori

スコア42

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テーブルからseatsテーブルLEFT JOINし、注文のついてない座席も取得したいです。
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
- ただし、それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
49
+ それぞれのテーブルの件数が10万ほどあるので、left joinの前にbase_seatsは、hall_idで抽出し、
39
50
  また結合先のseatsテーブルは、event_idで抽出しないと、時間がかかってしまいます。
40
51
 
41
52
  # やってみたこと

3

改善

2019/10/17 12:46

投稿

orori
orori

スコア42

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
- base_seatモデルとseatモデルは、1対多の関係となります。
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

文章の改善

2019/10/17 12:39

投稿

orori
orori

スコア42

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|place|
15
+ |id | hall_id| name|
17
16
  |---|--------|-----|
18
17
  |1 | 1| 1-1|
19
18
  |2 | 1| 1-2|

1

間違い修正

2019/10/17 12:33

投稿

orori
orori

スコア42

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.`place_id` = 16
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.`place_id` = 16
73
+ WHERE b.`hall_id` = 16
74
74
  ```
75
75
 
76
76