mysql:14316
From: "玉越大輝" <"玉越大輝" <hiroki.tamakoshi@xxxxxxxxxx>>
Date: Fri, 30 Nov 2007 20:19:17 +0900
Subject: [mysql 14316] グループごとに、グループ内での条件を満たす行のみを取り出す方法
こんにちは、株式会社ビービットの玉越です。 一つ苦心していることがありまして、うまい方法が思い浮かばないので質問させて下さい。 ■今こんなテーブル test があるとします。 a_group a_amount a_time1 a_time2 1 100 1 10 1 200 4 6 1 300 10 20 2 10 4 5 2 20 4 6 ■このテーブルから、a_groupごとに、a_time2-a_time1が最小の行を取り出したいと思っています。 結果は下記を期待しています。 a_group a_amount a_time1 a_time2 1 200 4 6 2 10 4 5 ■SQLは下記のようになります。 SELECT a_group, a_amount, a_time1, a_time2 FROM test WHERE ( a_group, a_time2 - a_time1 ) IN ( SELECT a_group, MIN( a_time2 - a_time1 ) FROM test GROUP BY a_group ) ■SQLの気持ち ・グループごとにa_time2 - a_time1の最小値を求める ・a_time2 - a_time1が合致する行を取り出す 集合演算なのでこれが素直な方法と思います。 ■現在行いたいことはもっと複雑なことです。 上記ではtestはすでにあるテーブルですが、実際には複数のテーブルを結合して、様々な条件で絞ったテーブルに対して行いたいと思っています。 SELECT a_group, a_amount, a_time1, a_time2 FROM test1, test2, test3, test4, test5, test6, ... WHERE test1.id = test2.test_id AND とかなんとか AND ... AND ( a_group, a_time2 - a_time1 ) IN ( SELECT a_group, MIN( a_time2 - a_time1 ) FROM test1, test2, test3, test4, test5, test6, ... WHERE test1.id = test2.test_id AND とかなんとか AND ... GROUP BY a_group ) テーブルの大きさにもよるでしょうが、数十分待っても返事がありません。 これでは、GROUP BYなどせずに全部持ってきてから自前で加工する方が速いです。 上記のSQLの気持ち悪いところは、同じ条件を2回書いているところです。 何かうまい方法はありますでしょうか? -- ------------------------------------------------------ ビービットはチームマイナス6%に参画しています ------------------------------------------------------ 株式会社ビービット 玉越 大輝 ユーザビリティ コンサルタント beBit,Inc. Tamakoshi Hiroki hiroki.tamakoshi@xxxxxxxxxx -------------------------------------------------------- 〒105-0001 東京都港区虎ノ門1-18-1 虎ノ門10森ビル7F TEL: 03-3509-7602 / FAX: 03-3509-7605 URL: http://www.bebit.co.jp/ --------------------------------------------------------
-> 14316 2007-11-30 20:19 ["玉越大輝" <hiroki.t] グループごとに、グループ内での条件を満たす行のみを取り出す方法 14317 2007-11-30 20:53 ┗[chuuken kenkou <ken_] 14318 2007-11-30 21:36 ┗[HIRATSUKA Sadao <hir] 14319 2007-11-30 22:02 ┣[HIRATSUKA Sadao <hir] 14323 2007-12-03 14:35 ┗["玉越大輝" <hiroki.t]