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

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

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

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

SQL

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

Q&A

1回答

539閲覧

SQLであるカラムが条件に合致する場合に並び替えたい

ig_h

総合スコア0

MySQL

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

SQL

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

0グッド

0クリップ

投稿2021/06/15 06:26

編集2021/06/15 10:34

テーブルの中に状態カラムを持つテーブル(Bテーブル)の条件に応じて出力する順番を変えるSQLを作成したいのですが上手く実現できません。
どのように修正すれば実現できるでしょうか?

sql

1SELECT 2  `A`.*, 3  `B`.id as B_id, 4  `C`.id as C_id, 5  `C`.operating_status as C_operating 6FROM `A` 7inner join `B` on `A`.id = `B`.A_id 8left outer join `C` on `C`.B_id = `C`.id 9ORDER BY 10  `A`.A_name ASC, 11  FIELD(C_operating, '稼働中', '一時停止中', '終了');

実行しているSQLは細部は省きますが上記のものです。
AテーブルとBテーブルが親子関係にあり、BテーブルとCテーブルが親子関係にあります。
実行結果としては
単にAテーブルのA_nameで並び替えられたものの内部で状態ごと(稼働中、一時停止中、終了中)に順序が変わるだけなので
状態が終了中のみのデータでもA_nameの昇順で上の方に存在してしまいます。
下記イメージ図
イメージ説明

本来実現したいこととしては
状態が’稼働中’であるデータを含んでいるものは上。
'一時停止中'、'終了中'のみのものは下。という順番にしたいということです。
上記にあるイメージでは完全に稼働状況別に別れてしまっていて同一A_nameがあっても状態が異なる場合は表示場所が変わってしまいます。

おそらくサブクエリを使うかなにかしないといけないとは思うのですが処理が浮かばないので、お力添えいただきたいです。
足りない情報などがあれば追記しますのでよろしくお願いいたします。

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

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

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

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

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

maisumakun

2021/06/15 06:32 編集

「実行結果」と「本来実現したいこと」の違いがわかりません(どちらでも全く同じデータの順序になるのではないでしょうか?)。
ig_h

2021/06/15 07:02 編集

>maisumakun様 自分の書き方が悪いですねすみません... 実行結果は単にcompaniesテーブルのcompany_nameで並び替えられたものの内部で状態ごと(稼働中、一時停止中、終了中)に順序が変わるだけなので 状態が終了中のみのデータでもcompany_nameの昇順で上の方に存在してしまいます。 実現したいのは状態が’稼働中’であるserviceを含んでいるデータは上。 '一時停止中'、'終了中'のみのものは下。という順番にしたいということです。
退会済みユーザー

退会済みユーザー

2021/06/15 06:54

稼働中,一時停止中,終了って文言を収めたテーブルに、表示順位を示すカラムをもたせて、ORDER BY句に加えれば。一時表を作るとか、サブクエリー+VALUESとか駆使すればできそうな気がするけど、具体例まではかけない。
ig_h

2021/06/15 07:03 編集

>m6u様 m6u様が言われている表示順位に関してはFIELD句にて実現できているのかな、と思っています。 自分的にやりたい処理は稼働中,一時停止中,終了という文言順での並び替えではあるのですが、 同一company_nameの場合はまとめて出力したい、といった具合であります。
Orlofsky

2021/06/15 07:08

ここに書いた内容と希望する出力結果を質問に反映しては?
ig_h

2021/06/15 07:11

>Orlofsky様 ありがとうございます!確かにそうですね、失念しておりました...
yambejp

2021/06/15 09:55

具体的なデータがないと回答がぶれます 2020/10の一時停止中が2つあったり、終了がすべて同じ取引開始月 だったりするのはどういう優先順位なのでしょうか? 取引開始月がない稼働中のデータはどうい根拠でしょうか?
ig_h

2021/06/15 10:11

>yambejp様 画像の方、確かに取引開始月は必要なかったですね、修正いたします。 申し訳ございません。 ちなみに質問の方に書いてあるSQLに目は通していただいていますでしょうか? 条件に入れていない取引開始月に対しての優先順位はないかと思うので、 回答に対する考慮点としてはあまり関係がないかと思うのですが質問の意図はどちらにあるのでしょうか?
guest

回答1

0

ざっと見た感じの感想では
たんにnameとC_operatingを逆にすればいいだけのような気がしますが

A.A_name ASC,

FIELD(C_operating, '稼働中', '一時停止中', '終了')

SQL

1FIELD(C_operating, '稼働中', '一時停止中', '終了') ASC, 2`A`.A_name ASC

具体的なサンプルもないし何をしたいかわかりません
joinとかしないで単純なサンプルから始めたほうがよいでしょう

SQL

1create table tbl(id int primary key,service_operating varchar(10),company_name varchar(30)); 2insert into tbl values 3(1,'aaa','ddd'), 4(2,'bbb','ggg'), 5(3,'ccc','kkk'), 6(4,'bbb','iii'), 7(5,'ccc','eee'), 8(6,'aaa','fff'), 9(7,'bbb','hhh'); 10 11select * from tbl order by field(service_operating,'bbb','aaa','ccc'),company_name

投稿2021/06/15 10:48

yambejp

総合スコア114994

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問