我正在尝试根据玩家的高分创建一个排行榜。
每个玩家的分数被随机输入到数据库中。
我需要根据他们的高分对他们进行排序,并对他们进行排名。
这里我想在datagridview中显示player_ID、player_name、player_nick和HP。
感谢任何帮助。
string query1 = "SELECT player_ID'Player ID',player_name'Player Name',player_nick'Nick Name',HP'High Score' FROM player_profile ORDER BY HP DESC";
到目前为止我的工作,我不知道如何排名
最佳答案
您可以使用 SQL 通过用户变量提供排名(我认为还有一些 Rank() 函数)。来自诸如工作台之类的东西:
SET @rank=0;
SELECT Name, HP, @rank:=@rank+1 As Rank FROM Demo ORDER BY HP ASC
您也可以通过代码来完成此操作,只需进行一点小小的更改即可:
string SQL = @"SET @rank=0;
SELECT Name, HP, StartDate, @rank:=@rank+1 As Rank
FROM Demo ORDER BY HP DESC;";
using (MySqlConnection dbcon = mySqlDB.GetMySQLConnection())
using (MySqlCommand cmd = new MySqlCommand(SQL,dbcon))
{
dbcon.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
dgv1.DataSource = dt;
}
结果:
表中没有 Rank 列,这是通过上面的 SQL 语句添加的。
如果你们有关系,事情就会变得更加复杂。您必须引入一些其他变量来跟踪 HP/Score 何时发生变化并仅在那时增加@rank。如果您想跳过平局的排名({1,2,2,4} 与 {1,2,2,3}),您还必须添加一个计数器。
一件事是您必须允许可以在连接字符串中指定的用户变量:
Server=SvrAddr;Database=myDB;Uid=myUsr;Pwd=myPass;Allow User Variables=True";
根据Connection Strings该选项从版本 5.2.2 开始可用
<小时/> This Great Answer展示了如何跳过初始化 rank
var:
string SQL = @"SELECT Name, HP, StartDate, @rank:=@rank+1 As Rank
FROM Demo, (SELECT @rank := 0) r ORDER BY HP DESC;";
添加 (SELECT @rank := 0) r
可以避免显式声明它。非常酷。
关于c# - 如何按特定列对 dataGridView 进行降序排序并对其进行排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599279/