PHP/MYSQL 查询:获取结果上方和下方的行!
Posted
技术标签:
【中文标题】PHP/MYSQL 查询:获取结果上方和下方的行!【英文标题】:PHP/MYSQL Query: Get line above and below result! 【发布时间】:2011-02-28 21:00:00 【问题描述】:我不知何故需要以下方法:
用户位于某个博客页面现在我想让他能够移动:
到下一个更受欢迎的页面或到下一个不太受欢迎的页面。意思是这样的:
[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。也许你能帮帮我。如果您需要更多信息,请告诉我。 (我只需要两个邻居。不需要第 4 页等。)
编辑:@Trevor 不,抱歉我不能。我更改了示例,使其更清晰。
【问题讨论】:
您是否有理由不能只查询 ID=1 或 ID=3? 【参考方案1】:注意:在各种 cmets 中得出的结论是,@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
【讨论】:
现在只需添加一些INNER
或 LEFT JOINS
即可完成排序。
我认为您根据 OP 的规范将上一页和下一页倒退了。此外,如果两个或更多页面具有相同的浏览量会怎样?然后它们将被跳过。
@mellamokb,@razzed:谢谢。已针对平局进行了调整。
而且,又一次学究气。看我的回答。这是我第一次意识到如果我们从id=5, views=4000
到id=4, views=5000
将不起作用,因为视图更大,但 id 更小。当VIEWS
是= 在多个条目之间时,您只需要ID < $CurrentPageId
的情况。
@mellamokb:你是对的。我会 +1 你的答案,因为如果我再摆弄我的答案,它最终会看起来像你的。【参考方案2】:
上一页:
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
【讨论】:
您不想在第一个查询中使用 ASCending ORDER 吗? @Joe:是的。谢谢!大声笑,在我们两个之间,我们应该得到一个好的答案! 众包处于最佳状态! :-)【参考方案3】:或
/* 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
【讨论】:
【参考方案4】:三个查询:
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;
并且,确保你有一个关于视图的索引。
【讨论】:
他上面的示例是在中途编辑的,令人困惑,因为他的第 1 页、第 2 页、第 3 页按 ID 排序不正确。他在中游进行了编辑,我进行了更正。我会坚持我的sheesh。 @razzed:使用 ID != 比较,您可能会陷入无限循环,在 ID=4、Views=100 和 ID=5、Views=100 之间来回跳动。你想测试 如@mellamokb's answer以上是关于PHP/MYSQL 查询:获取结果上方和下方的行!的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Logging:显示匹配行上方和下方的行
PHP/mysql:使用数组查询 MySQL 并在数组中获取结果