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

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

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

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

Q&A

解決済

2回答

2156閲覧

TIME型同士の比較を含むSQLの書き方について

teltelboy

総合スコア16

MySQL

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

0グッド

0クリップ

投稿2020/03/20 15:09

編集2020/03/20 22:20

MYSQLの経験値が浅いこともあり、MYSQLのSQLの書き方について、困っております。
恐れ入りますが、解決方法がわかるようでしたら、ご教示頂けますと助かります。

前提・実現したいこと

・MYSQL5.7を使っています。
・以下の要件を1つのSQL文で実現したいです。

①table_Bから選手名を条件に最も早い記録(min(record))とその大会日付を抽出する。
②table_Aのベストタイムとtable_Bの最も早い記録(min(record))を比較する。
③比較した結果、table_Bの記録が速い場合はtable_Aのrecord、dayを更新する。
table_Aの記録が速い場合は更新しない。

ex) 佐藤太郎
①:"0:00:09.99"、"2020/3/20"を抽出する。
②:【table_A 】"0:00:10.22" > 【table_B 】 "0:00:09.99"
③:【table_A 】のrecordを"0:00:09.99"、dayを"2020/3/20"に更新する。

イメージ説明

発生している課題

・上記②で異なるテーブルのrecord(TIME型 time(2))を比較する場合にSQLの書き方がわかっておりません。
・①、②、③をそれぞれ分けたSQLは書けますが、1つにする方法がわかっておりません。

補足情報(FW/ツールのバージョンなど)

SQLを1つにまとめるのはこの後に、アプリに利用するためです。

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

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

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

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

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

sazi

2020/03/20 16:19

table_Aは自己ベストなのに複数件あるのは何故ですか?
hoshi-takanori

2020/03/20 18:00

太郎さんと次郎さんだからですね。(紛らわしいので姓も変えた方が分かりやすいと思います。) ところで、自己ベストは大会記録の中から選ばれるんでしょうか? それなら、テーブルじゃなくてビューで良いのでは?
teltelboy

2020/03/20 22:30

コメントありがとうございます。 >table_Aは自己ベストなのに複数件あるのは何故ですか? hoshi-takanori様のコメント通りになります。紛らわしいので、資料を修正しました。 (変更前)佐藤次郎 ⇒(変更後)田中花子 >ところで、自己ベストは大会記録の中から選ばれるんでしょうか? それなら、テーブルじゃなくてビューで良いのでは? 自己ベストは大会記録から選ばれますので、ビューによる実装も可能です。この考えは私自身なかったので、ビュー実装を検討させていただきました。 デメリットとして、このビューが呼ばれる回数が非常に多くなることが想定されるため、性能面がどうしても気になってしまいます。ですので、できれば、自己ベストテーブルに事前に格納しておきたいです。 ※呼ばれる回数の点は事前の説明足りてなかったですが、選手数が非常に多いことと、自己ベストを表示する画面を頻繁に使うためです。 ご不明な点等ございましたら、ご連絡いただければと思います。
guest

回答2

0

ベストアンサー

SQL作成してみました

sql

1update table_A t0, 2(select t1.* from table_B t1 join 3 (select name, kyori, min(record) record from table_B group by 1,2) t2 4 on t1.name=t2.name and t1.record=t2.record and t1.kyori=t2.kyori 5) t3 6set t0.record=t3.record, t0.day=t3.day 7where t0.name=t3.name and t0.kyori=t3.kyori 8and t0.record>t3.record 9;

簡単な名前・距離指定から

sql

1update table_A t0, 2(select t1.* from table_B t1 join 3 (select name, kyori, min(record) record from table_B group by 1,2) t2 4 on t1.name=t2.name and t1.record=t2.record and t1.kyori=t2.kyori 5) t3 6set t0.record=t3.record, t0.day=t3.day 7where t0.name=t3.name and t0.kyori=t3.kyori 8and t0.record>t3.record 9and (t0.name,t0.kyori)=('佐藤 太朗','100M') 10;

投稿2020/03/21 08:45

編集2020/03/22 01:32
amura

総合スコア333

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

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

teltelboy

2020/03/21 13:11

ご回答下さり、ありがとうございます。 table_Aの全行を更新する形のSQLの書き方について、勉強になりました。 すみません、私の質問の仕方が悪かったのですが、 今回はtable_Aの1行単位に上記①②③を1つのSQLで実現したいと考えております。 具体的には、"佐藤太郎"だけに絞って、上記①②③を1つのSQLで書く方法をご教示いただけないでしょうか。
amura

2020/03/21 13:37 編集

table_Aの1行が決まる条件を教えていだだきますでしょうか?例えば連番が有ると良いのですが。名前指定でも良いです。
teltelboy

2020/03/21 13:37

table_Aは選手名(name)、距離(kyori)で行が一意になるようにしております。 ※連番振らないと、書けない場合は連番を追加することも可能です。 お手数ですが、ご確認いただけますと助かります。
amura

2020/03/21 13:49

RDBは基本的に順番を持っていないため常に同じものが一番目にselectされる事を保証していません。ですのでテーブル作成時に連番を振る事で対応する方法が有ります。create tableに id MEDIUMINT NOT NULL AUTO_INCREMENT, を加えることが出来、この番号を条件に加えます。 他には、選手名と距離が指定できるならsqlの条件に加える事もできます。
guest

0

INSERT ... ON DUPLICATE KEY UPDATE 構文を使用してupsert(あれば更新無ければinsert)すれば、table_aを常に最新の状態にできます。
その為には一意キーを明確にする必要がありますが。

投稿2020/03/23 00:48

編集2020/03/23 00:49
sazi

総合スコア25206

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

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

teltelboy

2020/03/23 22:58

ご回答ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問