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

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

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

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

Q&A

3回答

2170閲覧

subqueryのorder byを効かすには

takagi.1994

総合スコア47

MySQL

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

0グッド

0クリップ

投稿2018/06/21 15:47

編集2018/06/22 03:12

やりたいことは、
tableAtableBとは1対nの関係で結合させて
tableB.cdの降順, tableA.idの昇順で取得したい。
また、条件によってtableB.cdで降順したtableB最初の1件の場合と全件が必要です。

tableAはマスターでtableBにデータがあるデータが蓄積されcdの値が増えていきます。
よって、値が大きいものが最新となります。
取得する際はtableaに対してソートをしてもその際のtableBのデータは最新順(つまり降順)とさせたい。
また、条件(最新の1件のみのflagがあるない)によってtableBから取得するデータを1件or全件としたい。

SELECT * FROM `tableA` LEFT JOIN `tableB` ON `tableA`.`id` = `tableB`.id GROUP BY `tableA`.`id` ORDER BY `tableA`.`id` ASC, `tableB`.`cd` DESC
SELECT * FROM ( SELECT * FROM `tableA` LEFT JOIN `tableB` ON `tableA`.`id` = `tableB`.id ORDER BY `tableB`.`cd` DESC ) as `tableC` GROUP BY `tableC`.`id` ORDER BY `tableC`.`cd` ASC

こんな感じで試してみたのですがうまくいきません。

うまく行く方法はありますでしょうか?

CREATE TABLE `tablea` ( `id` int(11) NOT NULL AUTO_INCREMENT, `customerName` varchar(60) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; CREATE TABLE `tableb` ( `cd` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL, `data1` varchar(255) NOT NULL, PRIMARY KEY (`cd`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; INSERT INTO `tablea` (`id`, `customerName`) VALUES (1, 'aaaa'), (2, 'bbbb'), (3, 'cccc'); (4, 'dddd'); INSERT INTO `tableb` (`cd`, `id`, `data1`) VALUES (1, 1, 'hoge11'), (2, 1, 'hoge12'), (3, 1, 'hoge13'), (4, 2, 'hoge21'), (5, 2, 'hoge22'), (6, 2, 'hoge22'), (7, 3, 'hoge31');

期待する結果1

id customerName cd id1 data1 1 aaaa 3 1 hoge13 1 aaaa 2 1 hoge12 1 aaaa 1 1 hoge11 2 bbbb 6 2 hoge23 2 bbbb 5 2 hoge22 2 bbbb 4 2 hoge21 3 cccc 7 3 hoge31 4 dddd null null null

期待する結果2

id customerName cd id1 data1 1 aaaa 3 1 hoge13 2 bbbb 6 2 hoge23 3 cccc 7 3 hoge31 4 dddd null null null

UI側で"最新のみ"のチェックボックスがあるのでそれにチェックがあるかないかによって
期待する結果は1と2に分かれます。

また、プログラム側でwhere区をUI側で選択されたその他の条件で組み立てて行くつもりですが、
今回はそこは問題になってはいません。

最新flagがあるかないかで基本的なsql分は分けたくないなと思っています。
where区を組み立てるロジックをできればそれぞれに書きたくない。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/21 15:51

この手の質問では、CREATE文でテーブルの定義、サンプルデータのINSERT文を提示してくれると手元の環境でサクッと試して確度の高い回答を提示できますが、それがないと、質問文んを読み込んでいちいちテーブル定義から書き起こす必要があります。精度の高い回答を求める場合は、定義およびデータを提示してほしい。
takagi.1994

2018/06/21 16:33

大変失礼しました。追記いたしました。
guest

回答3

0

「同じIDで登録されたものの内の最新のCDのデータ」というを解釈しました。
相関副問合せで、同じIDで最大のCDを条件とします

SQL

1select * 2from tableb as tb left join tablea as ta 3 on tb.id=ta.id 4where not exists(select 1 from tableb where id=tb.id and cd > tb.cd) 5order by tb.id, tb.cd

または

SQL

1select * 2from tableb as tb left join tablea as ta 3 on tb.id=ta.id 4where tb.cd=(select max(cd) from tableb where id = tb.id) 5order by tb.id, tb.cd

投稿2018/06/22 00:54

編集2018/06/22 01:08
sazi

総合スコア25184

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

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

yambejp

2018/06/22 01:01

existsの後ろに余計な「=」が・・・
sazi

2018/06/22 01:05

あ、ホントだ。コピーして書き換えたから・・ 指摘ありがとうございます。
guest

0

どんな結果を想定しているのか見えてきませんが、
単にcdとidのソート順が違うだけでは?

SQL

1select * from tableA as t1 2inner join tableB as t2 on t1.id=t2.id 3order by t1.id asc,t2.cd desc

追記

もしcdの最大値だけとってid順に表示したということであればこう

SQL

1select * from tableA as t1 2inner join tableB as t2 on t1.id=t2.id 3where not exists(select 1 from tableB where id=t2.id and cd>t2.cd) 4order by t2.id asc

投稿2018/06/22 00:45

編集2018/06/22 00:53
yambejp

総合スコア114814

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

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

0

SUBQUERYにする必要がわかりません。

CREATE TABLE文が提示されたのでSELECT文を訂正しました。

SQL

1SELECT DISTINCT 2 B.`cd` 3 ,A.`id` 4 , A.`customerName` 5 , B.`data1` 6FROM `tableA` A 7LEFT JOIN `tableB` B 8ON A.`id` = B.`id` 9ORDER BY B.`cd` DESC, A.`id`

投稿2018/06/21 16:00

編集2018/06/21 22:10
Orlofsky

総合スコア16415

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

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

takagi.1994

2018/06/21 16:32

早速のご回答ありがとうございます。 試してみましたが、`tablea`.`id` ASCが効かないようです。 また、この場合、tableB.cdの全件は取得できても降順の最初の1件のみが取得できません。
Orlofsky

2018/06/21 17:15

CREATE TABLE文が提示されたのでSELECT文を訂正しました。
takagi.1994

2018/06/21 17:23

group by A.idをつけるとb.cdが昇順となってしまい、期待する値(最新)ではなくなってしまいます。
Orlofsky

2018/06/21 17:42

group byではなくDISTINCTにしました。 どんな出力結果が欲しいのか「質問」に追加しては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問