やりたいことは、
tableA
とtableB
とは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区を組み立てるロジックをできればそれぞれに書きたくない。