Mysql next&以前的记录问题

时间:2012-05-26 08:13:51

标签: mysql pagination

我的网站上有一个图片库,我想要实现一个下一个/上一个按钮,一旦我到达数据库的末尾,它就会被发送回第一张图片。

我有一个MYSQL查询适用于下一个按钮,问题来自前一个。我使用与下一个按钮相同的代码(更改了值以使其工作)但它仍然停留在我的数据库的第一项上。

我正在使用id字段对列表进行排序,该字段只是一个自动增量字段。

这是我的下一个代码:

SELECT * 
FROM photos
WHERE   
         id = (SELECT MAX(id) FROM photos WHERE status = '0' AND id < ".$id.") 
      OR id = (SELECT MAX(id) FROM photos WHERE status = '0' )
LIMIT 1

这是我之前的代码,不起作用:

SELECT * 
FROM photos
WHERE   
         id = (SELECT MIN(id) FROM photos WHERE status = '0'  AND id > ".$id.") 
      OR id = (SELECT MIN(id) FROM photos WHERE status = '0' ) 
LIMIT 1

$ id变量是当前图片ID。

我知道有很多关于SO的下一个/前一个问题,但我找不到任何帮助我的问题。

1 个答案:

答案 0 :(得分:0)

您的问题来自OR子句中的第二个WHERE操作数,其中包括两个查询中的第一张/最后一张照片,而不管结果集中的当前位置如何;因为MySQL没有保证在没有指定ORDER BY子句的情况下返回结果的顺序,所以第一项可能在你想要的前一项之前被排序,因此LIMIT子句导致只返回该项目。

您可以通过分别指定ORDER BY id DESCORDER BY id ASC来解决此问题,但是这些测试确实应该根据是否返回任何结果在您的应用程序中进行 - 所以我建议删除这些操作数完全。

然后,您可以简化查询,下一步:

SELECT   *
FROM     photos
WHERE    status = 0 AND id < $id
ORDER BY id DESC
LIMIT    1

以前的:

SELECT   *
FROM     photos
WHERE    status = 0 AND id > $id
ORDER BY id ASC
LIMIT    1

(这假设您实际上打算使用“next”获取较低id的照片,而使用“previous”获取较高id的照片;否则将两个查询交换掉)。