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

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

解決済

3回答

316閲覧

SQLにて、特定条件レコードの有無を取得条件にする方法

emeraldworm

総合スコア16

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/06/20 11:03

お世話になっております。

以下のようなデータをもつテーブルがあります。

id,name,dept,level
1,yamada,A1,10
2,tanaka,A2,10
3,suzuki,A3,10
4,kobayashi,A4,10
5,satou,A4,20

この時に、
同じdeptに異なるlevelの複数idが存在する場合、
levelが20のレコードを優先する形で抽出。
存在しない場合、levelが10のレコードを抽出するようにしたいです。

求める結果
id,name,dept,level
1,yamada,A1,10
2,tanaka,A2,10
3,suzuki,A3,10
5,satou,A4,20

上手い方法がありましたらご教示ください。

宜しくお願い致します。

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

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

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

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

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

maisumakun

2018/06/20 11:08

dept,levelの2つセットで考えた場合は、レコードはUNIQUEということで間違いないでしょうか。
emeraldworm

2018/06/21 02:04

ご返信ありがとうございます。deptとlevelはuniqueではありませんので、同dept同levelが複数存在することはあり得ます。
maisumakun

2018/06/21 02:13

同じdeptにlevelが20のレコードが複数あった場合、どれを抽出すればいいのでしょうか。
emeraldworm

2018/06/21 02:14

ご返信ありがとうございます。その場合は、20のレコード全てが抽出されてほしいです。20がなく、10が複数の場合も同様になります。
guest

回答3

0

ベストアンサー

相関問い合わせで、「自身のID以外で、deptが同じ、かつlevel=20のデータが存在しないもの」

SQL

1select * from テーブル t1 2where not exists( 3 select 1 from テーブル 4 where id<>t1.id and dept=t1.dept and level=20 5 )

投稿2018/06/20 11:40

sazi

総合スコア25195

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

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

emeraldworm

2018/06/21 03:21

ご回答ありがとうございました。皆様から頂いたSQLを基に、無事望むデータが抽出できました。
guest

0

levelは10と20しか存在しないのでしょうか?
仮に10と20と30があっても20を優先したいのでしょうか?
それとも単に最大値のレコードを抽出したいのでしょうか?

とりあえず最大値のレコードを含むものを抽出する方法

  • 元データ

SQL

1create table tbl(id int unique,name varchar(20),dept varchar(10),level int); 2insert into tbl values 3(1,'aaa','A1',10), 4(2,'bbb','A2',10), 5(3,'ccc','A2',10), 6(4,'ddd','A3',10), 7(5,'eee','A3',10), 8(6,'fff','A3',20), 9(7,'ggg','A4',10), 10(8,'hhh','A4',20), 11(9,'iii','A4',20), 12(10,'jjj','A5',20), 13(11,'kkk','A5',20), 14(12,'lll','A6',20);
  • 抽出

SQL

1select * from tbl as t1 2where not exists 3(select 1 from tbl where dept=t1.dept and level>t1.level)

投稿2018/06/21 02:29

yambejp

総合スコア114839

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

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

emeraldworm

2018/06/21 03:21

ご回答ありがとうございました。皆様から頂いたSQLを基に、無事望むデータが抽出できました。
guest

0

条件を抽出した上でJOINしましょう。

SQL

1SELECT main_table.* FROM table_name AS main_table 2INNER JOIN ( 3 SELECT dept, MAX(level) AS max_level FROM table_name GROUP BY dept 4) AS cond 5ON main_table.dept = cond.dept AND main_table.level = cond.max_level

投稿2018/06/21 02:27

maisumakun

総合スコア145184

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

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

emeraldworm

2018/06/21 03:21

ご回答ありがとうございました。皆様から頂いたSQLを基に、無事望むデータが抽出できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問