2010-09-07 111 views
3

我试过寻找其他帮助解决这个问题,但我只是没有得到它。假设我有一张如下所示的表格。在按日期排序并允许重复日期时获取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,但我是根本没有得到这些结果。

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

回答

3

如果您要在视图中使用PREV和NEXT按钮,那么您将需要一个坚实的概念基础来为数据模型中的记录排序。正如你已经注意到的,你的date_col并没有这样做,因为它允许重复。

看起来你的NEXT(id)概念的意思是“ID号最小的ID号大于当前ID号并且其日期大于当前行日期的行”。没关系,但它有一个缺陷:在所有情况下,PREV(NEXT(id))不一定等于id。这可能会让你的用户陷入困境,并且可能会将你的程序逻辑推动到一些真正的问题上来让事情发挥作用。

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

获得“下一个”行,无论是做

SELECT id FROM table WHERE id = current_id +1 

,或者,如果你的ID号不能保证是连续的,做

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按钮的等效版本。

+0

啊,感谢亚先生!这实际上有助于为我澄清事情。 – wavematt 2010-09-09 16:31:17

0

如果你能处理的初始数据命中(记录不是很大),一个很简单的锻炼将所有查询到通过阵列功能所必需的阵列,顺序,然后在此基础上还数组键抓取数据您的订购。同样,在这个例子中,限制是,如果你将要处理大量数据的,它可能不是最好的选择。

相关问题