2012年7月11日

[mysql 15791] Re: カテゴリ毎の上位3件

あきらです

> 速度は心配ですが、メンテナンス時の可読性を考えると、こちらの
> ほうがシンプルで良さそうですね。

件数によりますが、速度心配ですね
予め順位のカラムを追加するバージョンを考えてみました
個人的にはカテゴリ別にSQLをプログラムから投げるほうが好ましい気がしますが、、、


-- テーブル定義
CREATE TABLE IF NOT EXISTS xxx2 (
id int,
nen int,
gaku int,
rank int
);

-- データ準備
INSERT INTO xxx2 (id, nen, gaku, rank) VALUES
(1, 2011, 600, 999),
(2, 2011, 500, 999),
(3, 2011, 450, 999),
(4, 2011, 750, 999),
(5, 2010, 450, 999),
(6, 2010, 600, 999),
(7, 2010, 350, 999),
(8, 2010, 800, 999),
(9, 2010, 600, 999);

-- 順位更新
UPDATE xxx2 t
set
rank = ( -- 自分より値段が低いものカウント
select
count(*)
from
(select * from xxx2) as t2
where
t2.nen = t.nen
and t2.gaku < t.gaku
) + ( -- 同じ値段のものはIDが小さいほうが上位
select
count(*)
from
(select * from xxx2) as t2
where
t2.nen = t.nen
and t2.gaku = t.gaku
and t2.id < t.id
) + 1

-- データ取得
select
*
from
xxx2
where
rank <= 3
order by
nen
, rank

-- 実行結果
7 2010 350 1
5 2010 450 2
6 2010 600 3
3 2011 450 1
2 2011 500 2
1 2011 600 3

あきら


投稿者 xml-rpc : 2012年7月11日 17:11
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/111247
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。