c# - 如何按特定列对 dataGridView 进行降序排序并对其进行排名?

标签 c# mysql sorting datagridview

我正在尝试根据玩家的高分创建一个排行榜。

每个玩家的分数被随机输入到数据库中。

我需要根据他们的高分对他们进行排序,并对他们进行排名。

这是我的表结构 enter image description here

这里我想在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;
}

结果:

enter image description here

表中没有 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/

相关文章:

c# - 如何定义不同类型的枚举长度

c# - 声明类变量 (List) 或将其发送给许多函数。什么是更好的?

c# - 从 app.config 注入(inject)连接字符串与从 BaseDataProvider 类读取它

mysql - 如何使用 GROUP BY 检索按字母顺序优先的结果集

php - 带有 avg 的奇怪 sql 查询

对元组向量进行排序需要第二个值的引用?

c# - 实例方法的 'this' 参数可以是无类型的(即 System.Object)吗?

mysql - 使用 NOT IN 子查询绕过 MySql 错误 1093

linux - 如何在 Linux 中打印与我的排序结果相关的所有行

algorithm - 对包含随机数的数组进行排序