評価列を持たない選択で評価を取得したい場合は、これが方法です。ただし、パフォーマンスの観点から、これが最良の選択肢であるとは保証できません。仕組みとしては、2 人のユーザーが同じ投票数を持っている場合、同じ評価が与えられ、次の異なる評価に必要な数だけスキップされます。
set @rating:=0;
set @count:=1;
select id,
case when @votes<>votes then @rating:=@rating+@count
else @rating end as rating,
case when @votes=votes then @count:=@count+1
else @count:=1 end as count,
@votes:=votes as votes
from t1
order by votes desc
sqlfiddle
これにより、無視できる余分な列が得られます。または、この選択をサブクエリにラップして、次のようにすることもできます。
select t2.id,t2.votes,t2.rating from (
select id,
case when @votes<>votes then @rating:=@rating+@count
else @rating end as rating,
case when @votes=votes then @count:=@count+1
else @count:=1 end as count,
@votes:=votes as votes
from t1
order by votes desc) as t2
しかし、sqlfiddleは不思議なことに一貫性のない結果を出しているので、テストを行う必要があります。誰かがこれがなぜなのか知っているなら、私はその理由を知りたいと思います.
1 人のユーザーだけの評価を取得したい場合は、サブクエリ オプションを実行し、where
afterを使用するfrom
と、目的の結果が得られます。sqlfiddle - しかし、繰り返しますが、結果に一貫性がありません。数回実行すると、評価が 10 になることもあれば、30 になることもあります。データベースでテストして、何が起こるかを確認するのが最善だと思います。