以下のようなテーブルがあります。
テーブル名:gamePlayData
項目1:playerName (String)
項目2:score (int)
scoreでorder byしたときに、ある特定の条件(playerName='HOGE' and score = 1234)が上から何レコード目にあるかをSQL文だけで取得することができたらそのSQL文を教えてください。
(アクセスが多く負荷をかけたくないので、PHPなどのプログラムで1件目からループさせて条件を判別していく方法は避けたいのでSQL一発で取得したいのです)
※過去の回答履歴を見て、適当な回答を繰り返していると判断した場合、その方の回答は開きません。
支払い率が100%でないのは、最近そういうモラルが感じられない回答がある為です、ご了承ください。
以下のSQLで指定したレコードが上から何レコード目にあるか求まります。
サブクエリで各レコードに連番を付与して、指定したレコードのみ抽出しています。
(指定したレコードが複数合った場合は最小値)
SELECT MIN(rank) FROM ( SELECT playerName , score , @a:=@a+1 AS rank FROM gamePlayData ,(select @a:=0) AS rank_dummy ORDER BY score DESC ) AS rank_data WHERE playerName = 'HOGE' AND score = 1234;
ただ、勝手に想像して申し訳ないのですが id:irhnhhtnさん が求めているSQLは、
指定したスコアが何位なのかを求めるSQLのような気がします。
ちなみにそうだとすれば、以下のようなSQLになります。
SELECT MIN(rank) FROM ( SELECT playerName , score , @a:=@a+1 AS rank FROM gamePlayData ,(select @a:=0) AS rank_dummy ORDER BY score DESC ) AS rank_data WHERE score = 1234;
元のデータを変更しても良い,という前提であれば,インクリメントするカラムを追加して,その値を取れば ok です
つまり,カラムに,"line"(int型) を追加し,SELECT してやります
AUTO_INCREMENT を有効にしておきます.INSERT する際には,このカラムは指定しなくても,自動でインクリメントされた数値が入ります
他にも方法はあると思いますが,PHP で処理するのに比べてコストが安いとは思えません
scoreは小さい順に並んでInsertされていけばlineは上から何番目のレコード、を意味することになりますが、scoreの値は大小バラバラでInsertされてくるので、Select時には order by score します。そうすると、lineの値は何番目のレコードという意味をなしません。
<<
そんなこと質問文のどこにも書いてないですよ
自分の質問文が曖昧なのに,それに対する回答に対し,ちょっと態度が失礼かと思います
この行為ははてなに通報しておきます
不適切な回答とさせて頂いたのは、「scoreでorder byしたときに」という質問の意図を無視した内容となっていたためです。
バラバラに並んでいなければ、order by scoreと記述する必要はない訳です。