我将为您提供我想要的简单示例
说我有一个带有以下ID的文章表(1、2、3、4、5、6、7、8、9、10)
现在,访问者想按文章标题对此文章进行排序
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和搜索标准和搜索顺序。
注意:解决方案应考虑性能,因为我有一张可能达到1,000,000行的表
在SQL中,您需要使用ROW_NUMBER() OVER
之类的东西。MySQL似乎无法使用。请参阅此问题。
这很简单。
上一篇文章将是标题最高(可以说)的文章,它仍然比第4条的标题少。您可以找到这样的标题:
SELECT MAX(title) AS maxTitle
FROM articles
WHERE title < (SELECT title FROM articles WHERE id = 4);
如果要获得该文章的ID,则可以将其加入原始表:
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;
这是一个SQL小提琴示例,其行以相同的方式排序,并且确实按照您的期望返回值6和1。