2011-02-28 22 views
1

我莫名其妙地需要进行如下的方式:PHP/MYSQL查询:获取上下线结果!

用户位于一些博客页面现在我想给他移动无论是能力:

到下一个比较流行的网页或下一个不太受欢迎页。意思是这样的:

[PAGE 5] | [PAGE 3 (User is here)] | [PAGE 2] 

(其中第1页=最受欢迎,第3页=最不受欢迎)。我的MySQL表看起来像这样:

[ID] [VIEWS] 
[1] [1000] 
[2] [2560] 
[3] [3200] 
[4] [200] 
[5] [4000] 

我的问题是具体的查询。在这种情况下唯一给定的变量是ID:2。也许你可以帮助我。只要告诉我你是否需要进一步的信息。 (我只需要两个邻居,不需要等等。)

编辑:@Trevor不,我不能。我更清楚地改变了这个例子。

+1

有没有你不能只是查询ID = 1的理由或ID = 3? – Trevor 2011-02-28 21:06:52

回答

1

备注:正如各种意见中所述,@mellamokb's answer比我的更好。我会删除这个答案,但因为它被接受而无法接受。

/* Next Page */ 
SELECT ID 
    FROM YourTable 
    WHERE VIEWS <= (SELECT VIEWS FROM YourTable WHERE ID = $CurrentPageId) 
     AND ID < $CurrentPageId 
    ORDER BY VIEWS DESC, ID DESC LIMIT 1 

/* Previous Page */ 
SELECT ID 
    FROM YourTable 
    WHERE VIEWS >= (SELECT VIEWS FROM YourTable WHERE ID = $CurrentPageId) 
     AND ID > $CurrentPageId 
    ORDER BY VIEWS, ID LIMIT 1 
+0

现在只需添加一些'INNER'或'LEFT JOINS',然后进行排序。 – Bojangles 2011-02-28 21:15:38

+0

根据OP的规格,我认为你得到了上一页和下一页。另外,如果两个或多个页面具有相同的视图,会发生什么情况?然后他们将被跳过。 – mellamokb 2011-02-28 21:16:19

+0

如果视图与另一个视图相同,则不起作用 – razzed 2011-02-28 21:25:42

0

三问:

SELECT @MyID:=ID,@MyViews:=Views FROM Table WHERE ID=2; 

利用当地的 “看”:

SELECT ID,Views FROM Table WHERE Views <= @MyViews AND ID != @MyID ORDER BY Views DESC LIMIT 1; 
SELECT ID,Views FROM Table WHERE Views >= @MyViews AND ID != @MyID ORDER BY Views ASC LIMIT 1; 

而且,请确保您有意见的索引。

+0

downvote没有评论? – razzed 2011-02-28 21:13:32

+0

这实际上是错误的! – linepogl 2011-02-28 21:14:27

+0

他的上面的例子在中途被编辑,并且因为他的页面顺序不正确而被命名为BY ID,所以令人困惑。他编辑中期,我编辑纠正。我会坚持使用我的sheesh。 – razzed 2011-02-28 21:21:53

1

对于前一页:

select ID as PreviousId 
    from PageViews 
    where Views > (select Views From PageViews Where ID = @Id) 
     or (
      Views = (select Views From PageViews Where ID = @Id) 
      and ID > @id 
     ) 
order by Views ASC, ID DESC 
    limit 1 

对于下一个页面:

select ID as PreviousId 
    from PageViews 
    where Views < (select Views From PageViews Where ID = @Id) 
     or (
      Views = (select Views From PageViews Where ID = @Id) 
      and ID < @id 
     ) 
order by Views DESC, ID DESC 
    limit 1 
+0

难道你不想在第一次查询的ASCending ORDER? – 2011-02-28 21:35:09

+0

@Joe:是的。谢谢!大声笑,在我们两个人之间我们应该得到一个很好的答案! – mellamokb 2011-02-28 21:36:57

+0

众包尽在其中! :-) – 2011-02-28 22:12:09

0

/* Previous Page */ 
SELECT ID 
    FROM YourTable 
    WHERE VIEWS < $CurrentPageViews 
    ORDER BY VIEWS DESC LIMIT 1 

/* Next Page */ 
SELECT ID 
    FROM YourTable 
    WHERE VIEWS > $CurrentPageViews 
    ORDER BY VIEWS LIMIT 1