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

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

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

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

Q&A

解決済

3回答

379閲覧

SQLで条件外はONをしないようにしたい

JanTh1989

総合スコア87

MySQL

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

0グッド

0クリップ

投稿2020/09/15 22:16

編集2020/09/16 02:24

DBでは検索結果がnullのみの場合、nullと値の場合、nullなし値のみの場合の3つのパターンがあります。
値が入っている場合は、minで取得したく、nullのみの場合はnullにしたいです。
その上で、ISNULL結果でnullかminかを分けてみました。
結果としては、nullと値・nullなし値については解決しました。
ただ、nullのみの場合が処理しきれずにおります。
ONの条件を"NULLのみ"ならしない、ができれば賄える想定なのですが、方法が分からずにおります。
こちら、ご教授願えないでしょうか。

DB

テーブル名:sample no val priority 1 AAA 1 1 BBB 2 1 CCC 3 2 AAA 1 2 BBB 2 2 CCC null 3 AAA null 3 BBB null 3 CCC null

期待結果

no val count 1 AAA 3 2 AAA 3 3 AAA 3

※no3については、取れた順で良いです。並び替えなどはありません。
※priorityで値があれば最小を取りたいです。

試したSQL

SELECT B.no as no, val, B.count FROM sample AS A INNER JOIN( SELECT no, count(*) as count, if(ISNULL(min(priority)),null,min(priority)) as min_priority FROM sample WHERE no = 1 or no = 2 or no = 3 GROUP BY no ) AS B ON (A.no = B.no AND A.priority = B.min_priority);

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

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

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

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

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

yambejp

2020/09/16 01:37

noでgroup byしてminをとるのですから no,count,min 1,3,1 2,3,1 3,3,null ですよね? それがなぜ期待結果 1のvalがCなのでしょうか? またminがnullのno=3はなぜvalが取れるのでしょうか?
Orlofsky

2020/09/16 02:19

ISNULL ってOracle ではサポートされていません。NVLかNVL2 の間違いでは?
JanTh1989

2020/09/16 02:25

失礼しました。 全部AAAで取ります。
Orlofsky

2020/09/16 03:24

あれ、[Oracle]タグがなくなっている。
guest

回答3

0

ベストアンサー

ちょっと私の理解が足りていないかもしれませんが

投稿2020/09/16 02:45

yambejp

総合スコア115012

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

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

yambejp

2020/09/16 02:46 編集

//元データ create table tbl(no int,val varchar(10),priority int null); insert into tbl values (1,'AAA',1), (1,'BBB',2), (1,'CCC',3), (2,'AAA',1), (2,'BBB',2), (2,'CCC',null), (3,'AAA',null), (3,'BBB',null), (3,'CCC',null);
yambejp

2020/09/16 02:45

//結果 select no, (select val from tbl where no=t1.no order by coalesce(priority,999) asc limit 1) as val ,count from (select no,count(*) as count from tbl group by no) as t1
kuma_kuma_

2020/09/16 02:59

たしかにこちらのほうがすっきりしているように思えます。
guest

0

なんかデータ取得が不思議な構造ですね...

nullしかない場合sum()すれば答えはnullになりますが
それで判定できるかと

追記
priorityがnullの時最大数を与えてみては?
例: 9999999999を最大数とする

SQL

1SELECT B.no as no, A.val, B.count, NVL2(A.priority,A.priority,9999999999) as min_priority 2FROM sample AS A 3INNER JOIN( 4 SELECT no, count(no) as count, min(NVL2(priority,priority,9999999999)) as min_priority 5 FROM sample 6 WHERE no = 1 or no = 2 or no = 3 7 GROUP BY no 8) AS B 9ON (A.no = B.no AND A.min_priority = B.min_priority);

nullしかない場合、最小値9999999999
nullと数値複合の場合、数値の最小値
数値しかない場合、数値の最小値
※count(*)ではなくcount(no)とフィールドを指定したほうが早い場合があります。
※Oracleが無いので別のDBで試していますSQL間違っていたらごめんなさい

投稿2020/09/15 22:36

編集2020/09/15 22:59
kuma_kuma_

総合スコア2506

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

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

JanTh1989

2020/09/15 22:54

joinのselectで if(sum(min(priority) > 0,min(priority),null) as min_priority すれば、ですか?
JanTh1989

2020/09/15 22:57

>1064 - You have an error in your SQL syntax; check the manual that >corresponds to your MySQL server version for the right syntax to use near 'min(priority),null) as min_priority 引っかかっちゃいますね・・・。 作りが違うのかも・・・。
sazi

2020/09/16 00:14

メッセージにはMySQLがありますが、タグはOracleですね。 どっちなんでしょう?
JanTh1989

2020/09/16 01:10

MySQLです。 Navicat for MySQLでレコードを取れるかの検証をしています。
kuma_kuma_

2020/09/16 01:29

MySQLならNVL2をIFNULLに書き換えてみて下さい。
sazi

2020/09/16 01:46 編集

@kuma_kumaさん これだとNo=3の場合、複数件取得になりませんか? @JanTh1989さん 「priorityで値があれば最小」とありますが、期待する結果は最大になっていませんか?
kuma_kuma_

2020/09/16 02:08

やっと意味がわかってきました Noでグループ化したときにpriorityが最大となるレコードを抽出したいのですね まず確認priorityは最少値が優先度高ではないのですか? 最大値が優先度高の場合IFNULL(A.priority,A.priority,-1)に変更してmaxで取得すればよいです 次にNo=3の場合このままだと複数件になりますね no val priority 1 DDD 1 なんてレコードが入っても複数件になります。 条件が足りないんです。 valの最小値(最大値)を追加すれば1件になります。
guest

0

もう一度前提条件を整理します
・Noでグループ化したときにpriorityが最大となるレコードを1件毎に抽出したい
・priorityが同じ値の時はvalが小さい値を優先する
・MySQLでのSQL構文

SQL

1SELECT DISTINCT A.no as no, A.val, B.count, IFNULL(A.priority,A.priority,-1) as priority_No 2FROM sample AS A 3INNER JOIN( 4 SELECT no, min(val) as min_val, count(no) as count, max(IFNULL(priority,priority,-1)) as priority_No 5 FROM sample 6 WHERE no IN (1, 2, 3) 7 GROUP BY no 8) AS B 9ON (A.no = B.no AND A.val = B.min_val AND A.priority_No = B.priority_No);

これでいけるかと思います

追記
期待結果が変更されているのですがpriorityが最少最大どちらを優先したいのですか?

投稿2020/09/16 02:26

編集2020/09/16 02:50
kuma_kuma_

総合スコア2506

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問