更新 MySQL 表中的排名
我有一个表 Player 的表结构如下
Table Player {
Long playerID;
Long points;
Long rank;
}
,假设玩家 ID 和点数具有有效值,我可以根据单个查询中的点数更新所有玩家的排名吗?如果两个人的积分相同,则他们应该并列排名。
更新:
我正在使用 hibernate,使用建议作为本机查询的查询。 Hibernate 不喜欢使用变量,尤其是“:”。有谁知道有什么解决方法吗?在这种情况下,要么不使用变量,要么使用 HQL 来解决 hibernate 的限制?
I have the following table structure for a table Player
Table Player {
Long playerID;
Long points;
Long rank;
}
Assuming that the playerID and the points have valid values, can I update the rank for all the players based on the number of points in a single query? If two people have the same number of points, they should tie for the rank.
UPDATE:
I'm using hibernate using the query suggested as a native query. Hibernate does not like using variables, especially the ':'. Does anyone know of any workarounds? Either by not using variables or working around hibernate's limitation in this case by using HQL?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一种选择是使用排名变量,如下所示:
JOIN (SELECT @curRank := 0)
部分允许变量初始化,而无需单独的SET
命令。有关此主题的进一步阅读:
测试用例:
结果:
更新:刚刚注意到您需要平局才能共享相同的排名。这有点棘手,但可以通过更多变量来解决:
对于测试用例,让我们添加另一个 175 分的玩家:
结果:
如果您需要排名在平局的情况下跳过一个位置,您可以添加另一个
IF
条件:结果:
注意:请考虑我建议的查询可以进一步简化。
One option is to use a ranking variable, such as the following:
The
JOIN (SELECT @curRank := 0)
part allows the variable initialization without requiring a separateSET
command.Further reading on this topic:
Test Case:
Result:
UPDATE: Just noticed the that you require ties to share the same rank. This is a bit tricky, but can be solved with even more variables:
For a test case, let's add another player with 175 points:
Result:
And if you require the rank to skip a place in case of a tie, you can add another
IF
condition:Result:
Note: Please consider that the queries I am suggesting could be simplified further.
丹尼尔,你有非常好的解决方案。除了一点——领带盒。如果 3 名玩家之间出现平局,则此更新无法正常工作。我将您的解决方案更改如下:
Daniel, you have very nice solution. Except one point - the tie case. If tie happens between 3 players this update doesn't work properly. I changed your solution as following:
编辑:之前提出的更新声明不起作用。
尽管这并不完全是您所要求的:您可以在选择时动态生成排名:
编辑:再次尝试 UPDATE 语句。临时表怎么样:
希望这有帮助。
EDIT: The update statement presented earlier did not work.
Although this is not exactly what you are asking for: You can generate the rank on the fly when selecting:
EDIT: Trying the UPDATE statement once more. How about a temporary table:
Hope this helps.
根据标准化规则,应在 SELECT 时间评估排名。
According to Normalization rules, rank should be evaluated at SELECT time.