[前][次][番号順一覧][スレッド一覧]

mysql:14318

From: HIRATSUKA Sadao <HIRATSUKA Sadao <hiratsuka.sadao@xxxxxxxxxx>>
Date: Fri, 30 Nov 2007 21:36:08 +0900
Subject: [mysql 14318] Re: グループごとに、グループ内での条件を満たす行のみを取り出す方法

平塚です。

商用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


[前][次][番号順一覧][スレッド一覧]

     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]