我将给你一个简单的例子来说明我想要什么
假设我有一个包含以下I的文章表(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行的表
发布于 2015-05-07 02:38:12
在SQL中,您可能希望使用像ROW_NUMBER() OVER这样的东西。这似乎在MySql中不可用;请参阅this question。
发布于 2015-05-07 02:40:34
这是相当简单的。
前一篇文章将是标题最高(可以说)的文章,它仍然小于文章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 Fiddle示例,它的行的排序方式与您的相同,并且如您所愿返回值6和1。
https://stackoverflow.com/questions/30084643
复制相似问题