按日期排序并允许重复日期在MySQL中获取上一条和下一条记录

时间:2010-09-07 21:46:04

标签: 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,但我根本没有得到这些结果。

有人可以解释如何正常工作吗?非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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按钮。

答案 1 :(得分:0)

如果你可以处理初始数据命中(记录集不是很大),一个非常简单的练习就是将ALL查询到数组中,根据需要通过数组函数进行排序,然后根据数组键获取数据,这也是你的排序。同样,这个例子的限制是,如果你要处理大量数据,它可能不是最好的选择。