こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ランキング

いつもお世話になっております。
MySQLでランキングの付け方を教えていただきたいと思います。

以下のようなテーブルがあります。
ItemCd | Count
1001 | 1
1003 | 2
1005 | 1
1007 | 3
1009 | 4
1010 | 4

下記のような「Rank」というカラムを作成して
ランキング順位で取得したいと思います。
ItemCd | Count | Rank
1009 | 4 | 1
1010 | 4 | 1
1007 | 3 | 2
1003 | 2 | 3
1001 | 1 | 4
1005 | 1 | 4

以下のSQLを発行してもエラーになってしまいました。
select r.*, count(*)+1 As Rank from tableA r left outer join tableB n on (r.Count < n.Count) order by count(*)

よろしくお願いいたします。

<環境>
PHP:4.3.2
Apache:2.0.40 (Red Hat Linux)
MySQL:3.23.58

投稿日時 - 2007-03-27 13:16:35

QNo.2869834

すぐに回答ほしいです

質問者が選んだベストアンサー

こんな感じかな?

select r.*, if(n.Count is null, 0, count(*)) + 1 as Rank
from tableA r left join tableA n on (r.type=n.type) and (r.Count < n.Count)
where r.type='A'
group by r.ItemCd
order by a.Count desc;

投稿日時 - 2007-03-27 16:41:58

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

また間違えました

誤: order by a.Count desc;
正: order by r.Count desc;

これでできました。
r.Count < n.Count で結合した時に、NULLも1レコードとしてcountされるので、ランクキングが変だったので、NULLの場合には0にすれば、ちゃんとランクづけできました。

投稿日時 - 2007-03-27 18:47:33

お礼

TagoSuck 様
ご回答ありがとうございます。

思っていた通りの結果が取得できました。
ありがとうございました。

投稿日時 - 2007-03-27 20:39:11

ANo.4

初めの質問では、ランキングの1位が2つあっても、次のランキングは2位になっていますが、お礼での補足説明は1位が2つで、次のランキングは3位になっていますが、どちらでしょうか?

やってみたところ、

ItemCd | Count | type | Rank
1007 | 3 | A | 1
1010 | 3 | A | 1
1001 | 1 | A | 2
1005 | 1 | A | 2



ItemCd | Count | type | Rank
1007 | 3 | A | 1
1010 | 3 | A | 1
1001 | 1 | A | 4
1005 | 1 | A | 4

ならできたんですけど...。

私のスキルでは...。

投稿日時 - 2007-03-27 16:31:06

補足

TagoSuck 様
ご回答ありがとうございます。
紛らわしくなってしまって申し訳ございません。

ItemCd | Count | type | Rank
1007 | 3 | A | 1
1010 | 3 | A | 1
1001 | 1 | A | 3
1005 | 1 | A | 3

としたいと思っております。
もし次のレコードがあったら、「Rank=5」になります。

よろしくお願いいたします。

投稿日時 - 2007-03-27 16:54:05

ANo.3

#1です

間違いだらけでごめんなさい。

誤: group by r.id, r.count
正: group by r.ItemCd, r.count

id ではなく、ItemCdですね。

投稿日時 - 2007-03-27 14:25:17

ANo.2

#1です

ごめんなさい。

誤: order by a.count desc
正: order by r.count desc

a ではなく、 r ですね。

投稿日時 - 2007-03-27 14:08:48

ANo.1

私の環境ではこうなりました。

select r.*, count(*) + 1 - 1 as Rank from tableA r left outer join tableA n on(r.count < n.count) group by r.id, r.count order by a.count desc;

でご希望の結果を得られました。

mysql: 5.2.1

投稿日時 - 2007-03-27 14:05:27

補足

TagoSuck 様
ご回答ありがとうございます。

説明が不足しておりました。
where句をつけた場合意図した結果を得ることができません。

以下のようなテーブルがあります。
ItemCd | Count | type
1001 | 1 | A
1003 | 2 | B
1005 | 1 | A
1007 | 3 | A
1009 | 3 | B
1010 | 3 | A

where type='A'
と付けたとき、以下のようにデータの取得をしたいと思います。
ItemCd | Count | type | Rank
1007 | 3 | A | 1
1010 | 3 | A | 1
1001 | 1 | A | 3
1005 | 1 | A | 3

説明不足で申し訳ございません。
ご教授お願いいたします。

投稿日時 - 2007-03-27 14:23:33

あなたにオススメの質問