SQL的行(排名系统)的位置没有相同的等级的两个记录


SQL position of row(ranking system) WITHOUT same rank for two records

所以我试图为我的网站创建一个排名系统,然而,很多记录有相同数量的点,他们都有相同的排名,有办法避免这种情况吗?

当前有

$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'];

和DB结构

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

编辑下面,

我现在做的是获取记录比如

SELECT * FROM tv WHERE type = 1

现在我运行一个while循环,我需要为自己创建一个函数来获取排名,但它会确保排名不重复如果两个记录的排名不同,我该如何创建一个排名系统呢?假设点数相等,它会按ID排序并得到它们的位置?或者类似的东西?谢谢你!

如果您使用的是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

select @rnk:=@rnk+1 as rnk,id,name,points
    from table,(select @rnk:=0) as r order by points desc,id   

您想使用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

许多数据库供应商已经在他们的产品中添加了特殊的功能来做到这一点,但是您也可以使用直接的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