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

【讨论】:

现在只需添加一些 INNERLEFT JOINS 即可完成排序。 我认为您根据 OP 的规范将上一页和下一页倒退了。此外,如果两个或更多页面具有相同的浏览量会怎样?然后它们将被跳过。 @mellamokb,@razzed:谢谢。已针对平局进行了调整。 而且,又一次学究气。看我的回答。这是我第一次意识到如果我们从id=5, views=4000id=4, views=5000 将不起作用,因为视图更大,但 id 更小。当VIEWS 是= 在多个条目之间时,您只需要ID &lt; $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 查询:获取结果上方和下方的行!的主要内容,如果未能解决你的问题,请参考以下文章

如何让 grep 打印每个匹配行下方和上方的行? [复制]

Google Cloud Logging:显示匹配行上方和下方的行

grep - 为每次点击返回周围的行[关闭]

PHP/mysql:使用数组查询 MySQL 并在数组中获取结果

比较 php MySQL 查询结果数组以从其中一个数组中获取关联值

PHP/MySQL 插入行然后获取 'id'