【问题标题】:SQL position of row(ranking system) WITHOUT same rank for two records行的 SQL 位置(排名系统),两条记录没有相同的排名
【发布时间】:2011-08-13 07:34:29
【问题描述】:

所以我正在尝试为我的网站创建一个排名系统,但是由于很多记录具有相同的点数,它们都具有相同的排名,有没有办法避免这种情况?

目前有

$conn = $db->query("SELECT COUNT( * ) +1 AS 'position' FROM tv WHERE points > ( SELECT points FROM tv WHERE id ={$data['id']} )"); 
$d = $db->fetch_array($conn); 
echo $d['position'];

和数据库结构

  `id` int(11) NOT NULL,
  `name` varchar(150) NOT NULL,
  `points` int(11) NOT NULL,

编辑如下,

我现在正在做的是让我们说记录

SELECT * FROM tv WHERE type = 1

现在我运行了一个 while 循环,我需要为自己创建一个可以获得排名的函数,但它会确保排名不重复 我将如何制作一个对两条记录没有相同排名的排名系统?假设点数相同,它会按 ID 对它们进行排序并获得它们的位置吗?或类似的东西?谢谢!

【问题讨论】:

  • 不太清楚你在问什么,你的目标是什么。你是在问一些排名算法,还是你有算法但是在sql中实现有困难???

标签: php mysql


【解决方案1】:

如果您使用的是 MS SQL Server 2008R2,则可以使用 RANK 函数。

http://msdn.microsoft.com/en-us/library/ms176102.aspx

如果您使用的是 MySQL,您可以查看以下选项之一:

http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/

http://www.fromdual.ch/ranking-mysql-results

【讨论】:

  • 他在问题上有一个mysql标签兄弟。
【解决方案2】:
select @rnk:=@rnk+1 as rnk,id,name,points
    from table,(select @rnk:=0) as r order by points desc,id   

【讨论】:

    【解决方案3】:

    您想使用ORDER BY。应用于多列就像用逗号分隔它们一样简单:ORDER BY points, id DESC 将按点排序,如果点相同,它将按 id 排序。

    这是您的 SELECT 查询:

    SELECT * FROM tv WHERE points > ( SELECT points FROM tv WHERE id ={$data['id']} ) ORDER BY points, id DESC
    

    支持这一点的文档:http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

    【讨论】:

    • 仍然对每个都说同样的话,可能是因为我已经运行了一个 Db 数组 fetchign(一个循环),然后尝试通过新连接获取位置?
    • 是的,我已将查询更新为实际获取而不是计数。直接在你的 SQL 编辑器中试试这个
    • 我尝试使用 SELECT * FROM tv WHERE points > ( SELECT points FROM tv WHERE id =256 ) ORDER BY points, id DESC 但是这返回了 12 行?尝试添加 num_rows 并在我的循环中运行,只是对所有这些都说 12,我猜这是因为它们中的很多都有 0 分,这是我需要以某种方式整理出来的,即使他们得到 0 分,他们也会仍然有不同的排名
    【解决方案4】:

    许多数据库供应商已在其产品中添加了特殊功能来执行此操作,但您也可以使用直接 SQL 来完成:

    Select *, 1 + 
       (Select Count(*) From myTable
        Where ColName < t.ColName) Rank
    From MyTable t
    

    或者为了避免给具有相同 colName 值的记录赋予相同的排名,(这需要一个键)

    Select *, 1 + 
       (Select Count(Distinct KeyCol) 
        From myTable
        Where ColName < t.ColName or
          (ColName = t.ColName And KeyCol < t.KeyCol)) Rank
    From MyTable t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多