我已经尝试过寻找其他帮助解决这个问题,但我只是没有得到它。假设我有一个类似下面的表。
+----+--------------+------------+
| 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,但我根本没有得到这些结果。
有人可以解释如何正常工作吗?非常感谢任何帮助。
答案 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查询到数组中,根据需要通过数组函数进行排序,然后根据数组键获取数据,这也是你的排序。同样,这个例子的限制是,如果你要处理大量数据,它可能不是最好的选择。