[pgsql-jp: 33393] Re: 並べ替えについて
SAITO Masaru
daisaito @ lares.dti.ne.jp
2004年 6月 26日 (土) 17:00:25 JST
齋藤@横浜です。
202004/06/26 16:15:47 ごろ
shima tetuo <mlmlml @ lily.freemail.ne.jp> さんは
"[pgsql-jp: 33392] 並べ替えについて"の件について
以下のように書きました
> tetuoと言います。
>
> 環境
> PostgreSQL 7.2.1 on i586-pc-linux-gnu, compiled by GCC 2.96
>
> 現在、WEBアプリケーションで商品の一覧を10アイテム1ページとして表示してお
> りますが、表示の並び替えで行き詰まってしまい、良い方法がないかと考えてい
> ます。
(略)
> ********************
> 現状
> (order by 価格 desc, 商品名)
> ********************
> ┌───┬───┐
> │商品名│価格 │
> ├───┼───┤
> │C商品 │11800 │
> ├───┼───┤
> │A商品 │9800 │
> ├───┼───┤
> │B商品 │7800 │
> ├───┼───┤
> │A商品 │5800 │
> ├───┼───┤
> │B商品 │4800 │
> ├───┼───┤
> │A商品 │3800 │
> └───┴───┘
これは当然そうなります。
order byは1行1行を別々に考えて並べ替えをするものです。
まず価格で並べ替えて、同じ価格の行が複数あった場合は
商品名でソートすると言う事ですので。
> ですが、現在、表示方法として下記のような結果が必要となっています。
>
> ********************
> ほしい結果
> 価格の降順をベースに、同一商品名がある場合はそれらを連続して、且つその同
> 一商品名での価格の降順
> ********************
> ┌───┬───┐
> │商品名│価格 │
> ├───┼───┤
> │C商品 │11800 │
> ├───┼───┤
> │A商品 │9800 │
> ├───┼───┤
> │A商品 │5800 │
> ├───┼───┤
> │A商品 │3800 │
> ├───┼───┤
> │B商品 │7800 │
> ├───┼───┤
> │B商品 │4800 │
> └───┴───┘
これの場合は、商品を群(group)としてとらえてから、
次にその内部でソートしたいという事ですので、一筋縄ではいきません。
まず商品名でgroup化して、そのmaxで並べ替えをしてその結果を
order byで指定して、その次に同一商品名の中で価格順にソートします。
これをSQLで表すと以下のような感じになります。
# カラム名、テーブル名はとりあえず仮で付けました。
# (日本語のカラム名などは個人的には嫌いですが)
select
商品テーブル.商品名,
商品テーブル.価格
from
商品テーブル,
(
select
max(価格) as max_price ,
商品名
from
商品テーブル
group by
商品テーブル
order by
max_price desc
) as 商品テーブル_price_order
where
商品テーブル.商品名=商品テーブル_price_order
order by
商品テーブル_price_order.max_price desc,
商品テーブル.商品名,
商品テーブル.価格 desc
# あと、このSQLは検証していません。動かない場合は
# ご自分で直して下さい。
#(現在PostgreSQLをさわれる環境にいません)
---
SAITO Masaru <daisaito @ lares.dti.ne.jp>
pgsql-jp メーリングリストの案内