質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

866閲覧

左外部結合の出力に長時間かかってしまう

orori

総合スコア42

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2019/05/07 01:47

編集2019/05/07 01:53

既存のDBをベースにrailsでアプリを作っている初心者です。
RailsなのでActiveRecord+MYSQLなのですが、その前にSQLでどのように表現するかがわかっておりません。

ほしい結果

あるイベントの座席状況として、座席のseatテーブルをベースに、予約のついている座席にだけevent_id, order_idが入るようにしたい。

seat_idplace_idseat_nameevent_idorder_id
111-1-111
211-1-2
311-1-312
411-1-412
511-1-5

試したこと

SQL

1SELECT seat.*, reservation.* 2FROM seat 3LEFT OUTER JOIN reservation 4ON seat.id = reservation.seat_id 5WHERE reservation.event_id = 1 6OR seat.place_id = 1

上ですが、実際の環境の100万件ほどの予約テーブルと100万件の座席テーブルでは1時間待っても結果が出ませんでした。OR文を削除すると、即座に結果は出力されました。ですが、それですと、空き席の情報が取得できません。

予約のついた席、通常の席、それぞれ出力して、JS内で配列として結合したほうがよいのか、など3日間ほどずっと悩んでいます・・・
何卒、よろしくお願いいたします。

既存の3テーブル

event table
idevent_nameplace_id
1エービーシー1
2あいうえイベント2
seat table

※複数のイベントに利用される、ある会場(place)の予約のない素の座席

idplace_idseat_name
111-1-1
211-1-2
311-1-3
411-1-4
511-1-5
621-1-1
721-1-2

reservation table

event_idseat_idorder_id
111
132
142

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/05/07 02:02

EXPLAIN SELECT (以下同じ)として、実行計画は確認してみましたか?
orori

2019/05/07 03:01

下の方で解決はしましたが、以前のSQL文で、EXPLAIN SELECTを行いますと、Using join buffer(Block Nested Loop)と出てましたので、問題となった部分を理解しておきたいと思います。ありがとうございました!
guest

回答2

0

そもそも希望の結果からすると、

SQL

1WHERE reservation.event_id = 1 2 OR seat.place_id = 1

上記のor条件ではないですね。

ある会場(place_id = 1)の特定のイベント(event_id = 1 )の状況なので、交わる所はAND条件です。
なので、yambejpさんのSQLが求めるものです。

それでも遅い場合は実行計画でインデックスが適用されているか確認して下さい。
必要なインデックスは、
seat(id,place_id)
reservation(seat_id,event_id)
だと思われます。

投稿2019/05/07 03:10

sazi

総合スコア25197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orori

2019/05/07 03:45

OR条件ではないこと、おっしゃる通りでした。ありがとうございます。 インデックスの適用について、現在SequelProで217msと表示されていますが、可能な限り早くしたいと考えています。 以下2つのテーブルの実行計画ですが、typeがconstなのでインデックスが適用されている(?)かと思います。ご提案の内容を実行し検討してみます。ありがとうございました! SIMPLE seat NULL ref place_id place_id 9 const 2688 100.00 NULL SIMPLE reservation NULL ref PRIMARY PRIMARY 8 const 1490 100.00 Using where
guest

0

ベストアンサー

ちゃんと理解していないかもしれませんがこう?

SQL

1SELECT seat.*, reservation.* 2FROM seat 3LEFT OUTER JOIN reservation 4ON seat.id = reservation.seat_id 5and reservation.event_id = 1 6where seat.place_id = 1

投稿2019/05/07 02:15

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orori

2019/05/07 03:03 編集

素晴らしいです!そのまま動きました!!なるほど、外部結合するテーブルをANDで絞り込んで、それをwhereで結合結果全体で絞り込むわけですね・・・ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問