php-按日期排序并允许重复的日期时,获取MySQL中的上一个和下一个记录

我已经尝试寻找其他帮助来解决这个问题,但是我没有得到.假设我有一张看起来像下面的表格.

+----+--------------+------------+
| id | date_col     | label      |
+----+--------------+------------+
| 1  | 2010-09-07   | Record 1   |
| 2  | 2010-09-03   | Record 2   |
| 3  | 2010-08-23   | Record 3   |
| 4  | 2010-08-23   | Record 4   |
| 5  | 2010-08-23   | Record 5   |
| 6  | 2010-08-12   | Record 6   |
| 7  | 2010-08-06   | Record 7   |
| 8  | 2010-08-06   | Record 8   |
| 9  | 2010-08-02   | Record 9   |
| 10 | 2010-08-01   | Record 10  |
+----+--------------+------------+

查询时,我根据date_col对这些记录进行排序,并使用id(或实际上是任何其他任意列)来帮助对重复的日期进行排序.

mysql_query("SELECT * FROM table ORDER BY date_col DESC,id DESC");

但是,当我一次只查询其中一个记录时,我希望有一个上一个和下一个按钮来导航到下一个或上一个记录.我的问题是date_col允许重复的值,因此,例如,当顺序确定下一个记录时,以下查询对我不起作用. (假设this_date是date_col值,this_id是我们正在查看的当前记录的id值)

mysql_query("SELECT id FROM table WHERE date_col > this_date ORDER BY date_col DESC,id DESC LIMIT 1");

甚至这对我也不起作用:

mysql_query("SELECT id FROM table WHERE date_col > this_date AND NOT id=this_id ORDER BY date_col DESC,id DESC LIMIT 1");

所以我要寻找的是这样的-如果我正在查看ID为#4的记录,由于它是由date_col DESC ID DESC排序的,因此上一条记录应为ID#5,下一条记录应为ID #3,但我完全没有得到这些结果.

有人可以解释如何使其正常工作吗?任何帮助深表感谢.

最佳答案
如果您的视图中将具有可用的PREV和NEXT按钮,则将需要一个坚实的概念基础来在数据模型中进行记录排序.正如您所注意到的,date_col并不能解决问题,因为它允许重复.

您的NEXT(id)概念似乎意味着“具有最小ID号的行,其ID号大于当前ID号,并且其日期大于当前行的日期.”没关系,但是有一个缺陷:PREV(NEXT(id))不一定在所有情况下都等于id.这可能会使您的用户转弯,并可能使您的程序逻辑陷入真正的困境中,以使事情正常进行.

为什么不简单地使用序列号?

要获得“下一个”行,请执行

SELECT id FROM table WHERE id = current_id +1

或者,如果不能保证您的身份证号码是连续的,请执行

SELECT min(id) AS id FROM table WHERE id > current_id

如果必须使用下一个按钮显示下一个日期而不是下一行,那么请执行

SELECT id,date_col
  FROM table 
 WHERE id = (   
  SELECT min(id) AS id
    FROM table 
   WHERE date_col > this_date
)

但是,如果这样做,请确保为date_col创建一个索引.所有这些查询的等效版本都可用于PREV按钮.

相关文章

在正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信...
> [合辑地址:MySQL全面瓦解](https://www.cnblogs.c...
物理服务机的CPU、内存、存储设备、连接数等资源有限,某个时...
1 回顾 上一节我们详细讲解了如何对数据库进行分区操作,包括...
navicat查看某个表的所有字段的详细信息 navicat设计表只能一...
文章浏览阅读4.3k次。转载请把头部出处链接和尾部二维码一起...