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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

SQL

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

Q&A

解決済

2回答

3706閲覧

サブクエリ以外で子テーブルの情報有無を抽出する方法について

love_engineerin

総合スコア19

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/10/13 16:15

編集2018/10/13 16:17

以下のようなテーブルがあるとします。

親テーブル

ID
1a
2b

子テーブル

ID親ID登録日
112018-1-1
212020-1-1
322019-1-1
422021-1-1

上記から登録日を期間を条件に親テーブルのIDと値を抽出したいです。
そのために以下のサブクエリを利用するSQLを作成しましたが、性能的に問題があると考えています。

sql

1SELECT 2 a.ID,3FROM 4 親テーブル a, 5 (SELECT b.親ID AS 親ID FROM 子テーブル b WHERE b.登録日 BETWEEN %条件% AND %条件% GROUP BY 親ID) c 6WHERE 7 a.ID = c.親ID

別の方法として親テーブルに登録日_FROM、登録日_TOというカラムを付与し、
こちらを条件にする方法も考えました。
(値は子テーブルからトリガーなどで更新する想定)

ID登録日_FROM登録日_TO
1a2018-1-12020-1-1
2a2019-1-12021-1-1

以下質問となります。

  1. サブクエリを利用せずにSQLを組むことは可能でしょうか。
  2. 検索の性能を上げるために親テーブルに子テーブルの情報を保持するような設計は

どのような検索をすればよいかわからず、こちらに質問いたしました。
ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答2

0

普通に内部結合で実現できることだ思いますが?
相関サブクエリではないのでそんなに性能的に差が出るとも思えません。

sql

1SELECT 親テーブル.* 2FROM 3 親テーブル INNER JOIN 子テーブル ON 親テーブル.ID = 子テーブル.親ID 4WHERE 5 登録日 Between %条件% And %条件%; 6

投稿2018/10/14 03:26

hatena19

総合スコア33715

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

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

love_engineerin

2018/10/14 05:34

ご回答ありがとうございます。 内部結合だと条件に合致する登録日の件数分取得されてしまいます。 Disctinctすればいいとは思いますが、結合する前に絞る方法があるとより良いと考えています。
hatena19

2018/10/14 05:59

なら、サブクエリしかないんじゃないかな。 性能を気にしているようですが、サブクエリで遅いといわれているのは相関サブクエリですが、そうではないので気にすることはないと思います。
guest

0

ベストアンサー

以下はサブクエリですけど、そんなに遅くなるかな。

SQL

1SELECT * 2FROM 親テーブル 3WHERE ID in ( 4 SELECT 親ID FROM 子テーブル WHERE 登録日 BETWEEN %条件% AND %条件% 5 )

遅いとしたら、インデックスが適切では無いと思われます。

親テーブルの件数が子テーブルに比してかなり少ないなら、インデックスが適切な場合、相関問い合わせによるexists判定が一番高速になる可能性があります。

SQL

1SELECT * 2FROM 親テーブル as t1 3WHERE exists ( 4 SELECT 1 FROM 子テーブル WHERE 登録日 BETWEEN %条件% AND %条件% and 親ID=t1.ID 5 )

投稿2018/10/13 18:24

編集2018/10/14 07:13
sazi

総合スコア25184

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

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

love_engineerin

2018/10/14 04:53

ご回答ありがとうございます。 仰る通り、どこまで遅くなるかというところはありますが、 サブクエリを使わずに実現できる方法があればと思い質問させていただきました。
sazi

2018/10/14 07:15

追記しました。
sazi

2018/10/14 07:19

親テーブルの件数に合わせるんですから、合わせる為の整形を行うならサブクエリーを使うしかありませんね。
love_engineerin

2018/10/16 00:15

なるほどです。仰る通りですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問