mysql:14323
From: "玉越大輝" <"玉越大輝" <hiroki.tamakoshi@xxxxxxxxxx>>
Date: Mon, 3 Dec 2007 14:35:39 +0900
Subject: [mysql 14323] Re: グループごとに、グループ内での条件を満たす行のみを取り出す方法
こんにちは、株式会社ビービットの玉越です。 忠犬さん、平塚さん、ありがとうございます。 まず a_time2 - a_time1 をあらかじめ計算して保存しておく列を作り、インデックスを張るというご指摘、ありがとうございます。 今回実際に行いたい処理は a_time1 と a_time2 は別々のテーブルから持ってきています。 そのため、都度計算をしています。 ただ、速度が問題になれば、ご指摘いただいたようにあらかじめ列を作っておくことはできると思いますので、そのときは検討します。 また、下記の★の部分に関するご指摘も大変ありがとうございます。 なるほど、依存関係を書けるのですね。 実際に、処理にかかる時間が大幅に減りました。 本当にありがとうございました。 お二人に感謝いたします。 07/11/30 に HIRATSUKA Sadao<hiratsuka.sadao@xxxxxxxxxx> さんは書きました: > 平塚です。 > > 商用DBMSだとファンクション索引とかいう機能がありますが、 > MySQLには無いので、忠犬さんのおっしゃるとおり引き算済みの列があると > よいと思います。 > > あと、最初の例ですが > > > > SELECT > > > a_group, a_amount, a_time1, a_time2 > > > FROM > > > test t1 > > > WHERE ( a_group, a_time2 - a_time1 ) IN ( > > > SELECT > > > a_group, MIN( a_time2 - a_time1 ) > > > FROM > > > test t2 > ★ > > > GROUP BY > > > a_group > > > ) > > ★のところに > WHERE t1.a_group = t2.a_group > を挟めないでしょうか。 > > これがないと中のSQLが何度も何度も全部のa_groupを > 集計してしまうように見えます。 > > > > > On Fri, 30 Nov 2007 20:53:23 +0900 > chuuken kenkou <ken_ken_1962@xxxxxxxxxx> wrote: > > > > > 忠犬です。 > > > > a_time2-a_time1の値を持つ列を、最初から作っておけないのでしょうか? > > > > 多くのRDBMSで、減算等を行うと、その列にインデクスが定義されていても使ってくれません。MySQLも、同様だったと思います。 > > > > a_time2-a_time1の値を持つ列を作れば、(a_group,新規の列)で構成されるインデクスがあれば使ってくれると思います。 > > > > > > > Date: Fri, 30 Nov 2007 20:19:17 +0900 > > > From: hiroki.tamakoshi@xxxxxxxxxx > > > Subject: [mysql 14316] グループごとに、グループ内での条件を満たす行のみを取り出す方法 > > > To: ml@xxxxxxxxxx > > > > > > こんにちは、株式会社ビービットの玉越です。 > > > > > > 一つ苦心していることがありまして、うまい方法が思い浮かばないので質問させて下さい。 > > > > > > ■今こんなテーブル 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/ > > > -------------------------------------------------------- > > > > > > > _________________________________________________________________ > > 「MSN クリスマス特集」今年は、最高の愛あふれるクリスマスにしませんか。 > > http://event.jp.msn.com/xmas2007/ > > -- > 平塚貞夫 hiratsuka.sadao@xxxxxxxxxx > > > -- ------------------------------------------------------ ビービットはチームマイナス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]