2013-02-26 64 views
-2

我使用这个mysql查询来逐级获得。我需要按排名获得上一个和下一个项目。根据等级从mysql获取上一行和下一行

例如:item的等级是99.在项目页面,我想显示第100,101,98和97个项目。

http://erincfirtina.com/apps/urdemo/track.php?tid=10

我需要做的相关曲目列表

这里是我的MySQL查询其取得名次:

SELECT 
uo.*, 
(SELECT COUNT(*) FROM tracks ui WHERE (ui.point, ui.id) >= (uo.point, uo.id)) AS rank 
FROM tracks uo WHERE id = 10 
+0

当你指的是100级,意思排名从'(SELECT COUNT(*)FROM未来轨道UI WHERE(ui.point,ui.id)> =(uo.point,uo.id) )AS等级?我们最好看看表格的结构来澄清 – fedorqui 2013-02-26 16:02:54

+0

进一步从@ fedorqui的评论,你应该把一个[小提琴](http://www.sqlfiddle.com)与你的一些数据 – hd1 2013-02-26 16:05:05

+0

这里是fiddleup链接: http://www.sqlfiddle.com/#!2/86f3b/1 – 2013-02-26 16:25:30

回答

0

你从来没有问过的问题。

我正在观察的一件事是,您在子查询中使用的表(uo)不是子查询的一部分。

也许你正在寻找:

SELECT uo.*, COUNT(*) AS rank 
FROM tracks ui, tracks uo 
WHERE (ui.point, ui.id) >= (uo.point, uo.id) 
    AND uo.id = 10; 

我很难与不知道你的表看起来像什么,或者你的问题其实是检验其准确性。

+0

此查询不起作用,因为您正在将聚合(COUNT(*)')与未聚合的字段混合使用。 – 2013-02-26 16:10:47

+0

是的,它需要一个GROUP BY,但如果没有更多的OP数据,我无法知道要分组的内容。 – thelr 2013-02-26 16:15:39

0

该查询应该可以工作,但它会非常糟糕。

SELECT * 
FROM (
    SELECT 
    uo.*, 
    (SELECT COUNT(*) FROM tracks ui WHERE (ui.point, ui.id) >= (uo.point, uo.id)) AS rank 
    FROM tracks uo WHERE id = 10 
) t 
ORDER BY t.rank DESC