人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mysqlで取得したデータにランキングを振りたいです。

以下のテーブル構成で、セール期間中(sale_str_dmとsale_end_dm)なら
セール価格(sale_price)を使い、そうでなければ価格(price)を使って
それで並び替えて順位をつけたいです。
サンプルを教えていただきたです。
CREATE TABLE ranking (
id bigint(20) NOT NULL primary key auto_increment,
name varchar(20) NOT NULL,
price decimal NOT NULL
sale_price decimal,
sale_str_dm datetime,
sale_end_dm datetime,
);

●質問者: FujiiRock
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Cherenkov
●200ポイント
select 
(case when now() <= sale_end_dm and sale_str_dm <= now() then
sale_price
else
price
end) as my_price
,* from ranking
order by my_price

FujiiRockさんのコメント
ありがとうございます〜 これに1,2,3のようなランキング列を出したいすねー

Cherenkovさんのコメント
[http://gihyo.jp/dev/serial/01/sql_academy2/000102:title=第1回 連番の特性を利用してデータ操作をもっと自由に SQLで連番を扱う (2)行集合に連番を割り当てる:SQLアタマアカデミー|gihyo.jp … 技術評論社:bookmark] これと同じようなのでいいんじゃないすかね。 mysql row_number でググるとよさそうです。 [http://q.hatena.ne.jp/1192783057:title=Mysqlの5で、OracleのRow_Numberみたいな 挙動をしたい場合は、.. - 人力検索はてな:bookmark]

質問者から

自分で作ったのは以下。
正しくでてそうだけど、あってるか不安。

SELECT
SHOUHIN_CD,
(CASE WHEN now() <= sale_end_dm AND sale_str_dm <= now()
THEN sale_price ELSE price END) AS LAST_PRICE,
(
SELECT
COUNT(*)
FROM
ranking b
WHERE
(CASE WHEN now() <= b.sale_end_dm AND b.sale_str_dm <= now()
THEN b.sale_price ELSE b.price END)
<
(CASE WHEN now() <= a.sale_end_dm AND a.sale_str_dm <= now()
THEN a.sale_price ELSE a.price END)
) + 1 AS RANKING
FROM
ranking a
ORDER BY
RANKING


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ