- ベストアンサー
MySQLでランキングの付け方を教えていただきたい
- MySQLを使用してテーブルのデータにランキングを付ける方法について教えてください。
- テーブルにはItemCdとCountの列があり、Count列を基準にランキングを作成したいです。
- さらに、既に該当のランクが存在する場合、同じランクを付けたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じかな? 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;
その他の回答 (5)
- TagoSuck
- ベストアンサー率72% (16/22)
また間違えました 誤: order by a.Count desc; 正: order by r.Count desc; これでできました。 r.Count < n.Count で結合した時に、NULLも1レコードとしてcountされるので、ランクキングが変だったので、NULLの場合には0にすれば、ちゃんとランクづけできました。
- TagoSuck
- ベストアンサー率72% (16/22)
初めの質問では、ランキングの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 ならできたんですけど...。 私のスキルでは...。
補足
TagoSuck 様 ご回答ありがとうございます。 紛らわしくなってしまって申し訳ございません。 ItemCd | Count | type | Rank 1007 | 3 | A | 1 1010 | 3 | A | 1 1001 | 1 | A | 3 1005 | 1 | A | 3 としたいと思っております。 もし次のレコードがあったら、「Rank=5」になります。 よろしくお願いいたします。
- TagoSuck
- ベストアンサー率72% (16/22)
#1です 間違いだらけでごめんなさい。 誤: group by r.id, r.count 正: group by r.ItemCd, r.count id ではなく、ItemCdですね。
- TagoSuck
- ベストアンサー率72% (16/22)
#1です ごめんなさい。 誤: order by a.count desc 正: order by r.count desc a ではなく、 r ですね。
- TagoSuck
- ベストアンサー率72% (16/22)
私の環境ではこうなりました。 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
補足
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 説明不足で申し訳ございません。 ご教授お願いいたします。
お礼
TagoSuck 様 ご回答ありがとうございます。 思っていた通りの結果が取得できました。 ありがとうございました。