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

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

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

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

Q&A

解決済

2回答

1086閲覧

テーブルの並び替えを複数条件で行いたい

lydii

総合スコア1

SQL

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

0グッド

0クリップ

投稿2021/06/25 09:31

編集2021/06/25 13:42

前提・実現したいこと

※SQL素人です。。以下についてご存知の方、ご協力いただけると大変助かります。

使用DBMSとバージョン:
MySQL 5.2.41

実現したい事は以下のテーブルのno1から順番にみて同じorder_noが下にあれば上に持って来て並び替えしたいです。

1.order_noカラムがそろうように並び替え
2.noの順番は上から

order by nameにするとorder_noでascendingかdescendingされてしまいます。
group byでやると集約されてしまうのかと。。。
新しいcolumnを追加などは可能です。

元データ:              

noorder_no
1ddd
2aaa
3ccc
4bbb
5ddd
6ccc
7aaa

実現したい内容:

noorder_no
1ddd
5ddd
2aaa
7aaa
3ccc
6ccc
4ddd

テーブル定義

mysql>sesc tmp_tbl_send_history; +--------------+-------------+------+------+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+------+---------+----------------+ | no | int(11) | NO | PRI | NULL | auto_increment | | company_name | varchar(32) | NO | | | | | site_name | varchar(32) | NO | | | | | exec_date | varchar(8) | NO | | | | | order_no | varchar(32) | NO | PRI | | | | order_date | varchar(24) | YES | | | | | order_nam | varchar(30) | YES | | | | | order_addr | varchar(80) | YES | | | | | order_tel | varchar(20) | YES | | | | | send_name | varchar(30) | YES | | | | | send_addr | varchar(80) | YES | | | | | send_tel | varchar(20) | YES | | | | | total_price | varchar(10) | YES | | | | | pay_method | varchar(32) | YES | | | | | goods_id | varchar(100)| YES | | | | | goods_items | text | YES | | NULL | | | goods_no | int(3) | YES | | NULL | | | file_name | varchar(80) | YES | | | | | goods_name | text | YES | | NULL | | | comment | text | YES | | NULL | | | memo | text | YES | | NULL | | | rapping | varchar(100)| YES | | | | | delivery | varchar(10) | YES | | | | +--------------+-------------+------+------+---------+----------------+ 23 rows in set (0.02 sec)

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

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

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

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

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

neko_the_shadow

2021/06/25 09:49

利用されているDBMSとバージョンは何でしょうか?
m.ts10806

2021/06/25 10:31

テーブル定義も提示してください
lydii

2021/06/25 13:03

DBMSとバージョン、テーブル定義を追加しました!
guest

回答2

0

ベストアンサー

MySQLのバージョンが5ということで、以下のようなクエリで実現できるかと思います。

SQL

1SELECT * 2FROM tmp_tbl_send_history AS T1 3ORDER BY ( 4 SELECT MIN(no) 5 FROM tmp_tbl_send_history AS T2 6 WHERE T1.order_no = T2.order_no 7), T1.no;

参考までに、MySQLのバージョンが8以降なら、同じことが以下のように書くことができるはずです。

SQL

1SELECT * 2FROM tmp_tbl_send_history 3ORDER BY MIN(no) OVER (PARTITION BY order_no ORDER BY no), no;

投稿2021/06/25 13:29

neko_the_shadow

総合スコア2261

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

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

lydii

2021/06/26 13:32

ありがとうございます。実現できました!order byの中にselectとwhereを使用して実現可能なんですね。勉強になります。
guest

0

記述は色々ありますが、全件表示ならインラインビューの方が高速だったような。
(order_no, no)のインデックスを追加した上で、以下ではどうでしょうか。

SQL

1SELECT t1,* 2FROM tmp_tbl_send_history T1 3 inner join ( 4 select order_no, min(no) grp_no from tmp_tbl_send_history group by order_no 5 ) t2 6 on t1.order_no=t2.order_no 7order by grp_no, no

投稿2021/06/25 13:54

sazi

総合スコア25206

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

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

lydii

2021/06/26 13:35

なるほど、inner joinを使用して実現可能になるんですね!ありがとうございます。大変勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問