[pgsql-jp: 35281] Re: 1件ずつ×4+ランダム2件 のような柔軟な取得方法について

Takao Kato sirius @ jp.fujitsu.com
2005年 4月 18日 (月) 16:53:50 JST


加藤@川崎です。

At Mon, 18 Apr 2005 15:59:47 +0900,
takada wrote:
>    id     |   shop   |   name   | comment
> ----------+----------+----------+----------
>  10001    | 大阪     |   goods1 |    text
>  10002    | 東京     |   goods2 |    text
>  10003    | 名古屋   |   goods3 |    text
>  10004    | 福岡     |   goods4 |    text
>  10005    | 東京     |   goods5 |    text

..snip..


効率が良いかどうかまでは検証できてませんが、以下サンプル。

CREATE TEMP TABLE abc (id INT,shop TEXT,etc TEXT) WITHOUT OIDS;
COPY abc (id,shop,etc) FROM STDIN;
1	東京	あ
2	東京	い
3	名古屋	う
4	名古屋	え
5	大阪	お
6	大阪	か
7	広島	き
8	広島	く
9	福岡	け
10	福岡	こ
\.

SELECT org.* FROM abc org,
 ((SELECT max(id) as id FROM abc
   WHERE shop IN ('大阪','東京','名古屋','福岡')
   GROUP BY shop LIMIT 1)
  UNION ALL
  (SELECT id FROM abc
   WHERE id NOT IN (SELECT max(id) FROM abc
                    WHERE shop IN ('大阪','東京','名古屋','福岡')
                    GROUP BY shop LIMIT 1) ORDER BY RANDOM())
  LIMIT 6) AS result
WHERE org.id = result.id ORDER BY org.id;


なんとなく同じ構文部分くらい CREATE VIEW して呪文を減らしたい気分です。
あと、下手なタイミングでIN条件を使っているので、

SELECT id,shop FROM
(SELECT max(id) as id,shop FROM abc GROUP BY shop) g_abc
WHERE shop IN (..snip..);

と変更すれば集約したあとでINがかかりますから、効率はあがるかも。それと
も単純に条件をORでつなぐ方が良いか。。。そのあたりのチューニングは 
explain で確認してください。

では
-------------------------------------------------------------
加藤@川崎



pgsql-jp メーリングリストの案内