我已经尝试寻找其他帮助来解决这个问题,但是我没有得到.假设我有一张看起来像下面的表格.
+----+--------------+------------+
| 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按钮.