rank()
在MySQL中有點棘手。一種方法是用一個相關子查詢:
select u.*,
(select count(*) + 1
from users u2
where u2.level < u.level
) as rank
from users u;
這是棘手放入update
。假設你有一個userId
列,您可以使用join
:
update users u join
(select u.*,
(select count(*) + 1
from users u2
where u2.level < u.level
) as rank
from users u
) ur
on u.userId = ur.userId
set rank_level = rank;
做與變量等級是相當棘手(row_number()
和dense_rank()
更容易),因爲它需要三個變量。這裏是select
版本:
select u.*,
(@r := if(@l = level,
if(@rn := @rn + 1, @r, @r)
if(@l := level,
@rn := @rn + 1, @rn := @rn + 1
)
)
) as ranking
from users u cross join
(select @l := -1, @rn : = 0, @r := 0) params
order by level;
第二個答案給我打上了一個問題,重複持有回答。它基本上是窗口化的rank()函數的MySQL版本。 – jpw
我不積極,這將被視爲重複 - 看到很多更糟糕的問題與類似的答案。這應該有所幫助:http://sqlfiddle.com/#!9/3e981/1 – sgeddes
@sgeddes如果你真的相信這個問題不一樣,並且我指出的答案不適用,你確實有權力重新打開這個問題。我相信我的評估是正確的。 – jpw