如何在mysql中捕获具有order by的特定行的邻居?

如何在mysql中捕获具有order by的特定行的邻居?,mysql,doctrine-orm,Mysql,Doctrine Orm,我会给你一个简单的例子,我想要什么 假设我有一个带有以下ID(1、2、3、4、5、6、7、8、9、10)的articles表 现在,访问者希望按照文章标题对文章进行排序,然后使用作者姓名,因此查询如下所示 SELECT `articles`.`id`, `articles`.`title`, `articles`.`body`, `authors`.`id`, `authors`.`name` from `articles` left join `authors` on `articles`.`

我会给你一个简单的例子,我想要什么

假设我有一个带有以下ID(1、2、3、4、5、6、7、8、9、10)的articles表

现在,访问者希望按照文章标题对文章进行排序,然后使用作者姓名,因此查询如下所示

SELECT `articles`.`id`, `articles`.`title`, `articles`.`body`, `authors`.`id`, `authors`.`name` from `articles`
left join `authors` on `articles`.`author_id` = `authors`.`name`
ORDER BY `articles`.`title` ASC, `authors`.`name` ASC;
这可能导致以下顺序(5,9,8,6,4,1,3,10,2,7)

然后访问者访问第4条的详细页面,现在我想从这个页面导航并抛出他的结果,即(5,9,8,6,4,1,3,10,2,7)

所以我想把文章编号“6”作为前一篇文章,把文章编号“1”作为下一篇文章

如何使用Mysql执行此操作,而在文章详细信息页面中,我只有文章ID、搜索条件和搜索顺序


注意:解决方案应该考虑性能,因为在SQL中有一个表可能达到1000000行

,您希望在上使用一些类似于<代码> RooSuxNoMe()的东西。这在MySql中似乎不可用;请参阅。

这相当简单

上一篇文章的标题最高(可以说),仍然低于第4条的标题。你可以发现,就像这样:

SELECT MAX(title) AS maxTitle
FROM articles
WHERE title < (SELECT title FROM articles WHERE id = 4);

下面是一个示例,它以与您相同的方式对行进行排序,并按照您的预期返回值6和1。

在mysql中,这并不容易。在其他具有窗口功能的数据库中,非常容易。如果保留当前文章在原始查询结果中的位置,则可以使用“LIMIT pos+1,1”重复查询,以进入下一个查询。此解决方案适用于此简单情况,但是,如果用户能够按另一个表中的另一个字段进行排序,该怎么办?假设表authors中的作者名称这实际上是我的案例您可以使用相同的查询,只需在查询@Karim中将标题替换为author抱歉我没有很好地解释我的案例,我的意思是访问者可以通过组合搜索(articles.title asc,authors.name asc)@Karim我现在明白了。我将不得不处理这个问题,但您可以做的一件事是添加一个索引,对列
1、2、3、4
进行排序,然后说如果您当前的文章是索引4,您可以从索引3中提取文章。我将尝试构建一个示例。我认为这项任务可以通过一个非常复杂的SQL语句来完成,这将影响性能。我认为执行这项任务最合适的方法是将文章的索引发送到详细信息页面url,这样我就可以从那里轻松导航。
SELECT a.id
FROM articles a
JOIN(
  SELECT MAX(title) AS maxTitle
  FROM articles
  WHERE title < (SELECT title FROM articles WHERE id = 4)) tmp ON tmp.maxTitle = a.title;
SELECT a.id AS nextArticle
FROM articles a
JOIN(
  SELECT MIN(title) AS maxTitle
  FROM articles
  WHERE title > (SELECT title FROM articles WHERE id = 4)) tmp ON tmp.maxTitle = a.title;