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

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

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

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

Q&A

解決済

2回答

686閲覧

最適化されたデータを削除したい

chapp

総合スコア233

MySQL

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

0グッド

0クリップ

投稿2020/09/19 14:27

最適化で構成されたデータを削除するための方法

お世話になります。初歩的な問題で恐縮致しますが、
IDで紐づいたデータ(最適化されたデータ)を削除するためのSQLを調べています。

usersテーブル
イメージ説明

scoresテーブル
イメージ説明

usersとscoresはusers.id = scores.user_idで紐づくものとします。

各テーブルのSQLはこちら

create table users ( id int primary key auto_increment, name varchar(255) default null, `group` varchar(10) default null ); insert into users values (null, "Johon", null), (null, "Suzuki", null), (null, "Alice", null), (null, "Satou", null), (null, "Tanaka", null); create table scores ( id int primary key auto_increment, test_name varchar(255) default null, user_id int not null, score int not null ); insert into scores values (null, "testA", 1, 76), (null, "testA", 2, 82), (null, "testA", 3, 66), (null, "testA", 4, 98), (null, "testA", 5, 55);

ここで、scores.scoreが 80 以上のユーザはusersテーブルから削除する場合、どのようなSQLとなるのでしょうか?

DELETE users FROM users LEFT JOIN scores ON scores.user_id = users.id WHERE scores.score >= 80 DELETE FROM users WHERE id in( SELECT user_id FROM scores WHERE score >= 80 )

これまで、お恥ずかしながら、scoresテーブルから該当のuser_idを抽出し、その値を基にusersテーブル内の該当データを削除するという、2度のSQLを発行していましたが、色々調べ、以下のような1度のSQLでも削除できるまで確認しました。

しかし、初めてのことで、結果は同じでもどちらが良いのか判断できず、アドバイス頂ければと投稿いたしました。

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/19 19:44

最適化されたデータって何を表しています?
chapp

2020/09/20 01:38

te2jiさん ご指摘ありがとうございます。 すみません、表現が不適切だったかもしれません。あくまでサンプルのように、usersテーブルのレコードをある条件に沿って削除したいという場面において、その条件となるカラムは紐づいた他のテーブルにある場合の削除方法(SQL)を伺いたく質問した次第です。
guest

回答2

0

ベストアンサー

left joinは微妙ですね、inner join でよいのでは?

SQL

1delete users from users 2inner join scores on users.id=scores.user_id and scores.score>=80

追記

SQL

1delete from users 2where exists (select 1 from scores where users.id=user_id and score>=80)

投稿2020/09/20 05:15

編集2020/09/20 05:24
yambejp

総合スコア115010

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

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

chapp

2020/09/20 09:08

yambe.jpさん アドバイスありがとうございます。 また、SQLのご提供にも感謝します。 教えて頂いたSQLを比較しならが見直し、検討してみます。 ありがとうございました。
guest

0

私なら2つ目のinを使う方を書きます。
というか1つ目の書き方は初めて見ました。

投稿2020/09/19 22:45

編集2020/09/19 22:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chapp

2020/09/20 01:44

m-oguraさん アドバイスありがとうございます。 inを使う方が一般的なのでしょうか。 お恥ずかしながら、今回のようなケースの場合、最初に条件となるデータを呼び出して・・・と、別々のSQLを踏んでいたわけですが、見た目的にも宜しくないと思い、1つのSQLでまとめようと調べているところでした。 なので、どちらが良いのかその判断基準が全く分からなくて・・・。 貴重なご意見ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問