[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 メーリングリストの案内