行的SQL位置(排名系统)两个记录的排名不相同

时间:2011-08-12 23:20:30

标签: php mysql

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

目前有

$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排序并得到它们的位置?或类似的东西?谢谢!

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

许多数据库供应商已经为其产品添加了特殊功能来执行此操作,但您也可以使用直接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