所以我正在尝试为我的网站创建一个排名系统,但由于很多记录都有相同数量的点数,它们都有相同的排名,有没有办法避免这种情况?
目前有
$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排序并得到它们的位置?或类似的东西?谢谢!
答案 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/
答案 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