2010-07-29 70 views
1

相同的数据我有一个表,它是由提醒日期则ID前进后退记录在MySQL与主

表看起来像排序第一名:

ID | remind_date 
1  2011-01-23 
2  2010-02-21 
4  2011-04-04 
5  2011-04-04 
6  2009-05-04 

我使用的是PHP前结束前进和后退的记录。我想有前进和后退按钮,但我遇到了2个提醒日期相同的问题。

只是要注意的ID是不按顺序,他们是在这里,但在实际的数据库中reminder_date排序时将它们混合起来

我使用select语句是:($ IID目前的纪录我我上)

SELECT id FROM myDB.reminders where remind_date > (SELECT remind_date FROM myDB.reminders where id=$iid) order by remind_date ASC LIMIT 1 

所以,当我到是相同的跳过了一个,因为它要求remind_date>的日期会发生什么。

如果我使用reminder_date> =它会返回当前记录。我的解决办法,然后用限价2,并通过PHP检查,如果第一个记录=我目前的ID,如果没有使用下一个。但它有3个日期相同或4等。

我也想过使用ID字段,但由于它们无序,我不能添加ID> $ iid。

任何想法?除了两个相同的日期以外,它的效果很好。

回答

1

您可能能够使用此:

SELECT ID, remind_date 
FROM 
(
    SELECT @prev_id := -1 
) AS vars 
STRAIGHT_JOIN 
(
    SELECT 
     ID, 
     remind_date, 
     @prev_id AS prev_id, 
     @prev_id := id 
    FROM myDB.reminders 
    ORDER BY remind_date, ID 
) T1 
WHERE prev_id = $iid 

这里是上面的测试与您的评论您的测试数据:

CREATE TABLE Table1 (ID INT NOT NULL, remind_date DATE NOT NULL); 
INSERT INTO Table1 (ID, remind_date) VALUES 
(45, '2011-01-14'), 
(23, '2011-01-22'), 
(48, '2011-01-23'), 
(25, '2011-01-23'), 
(63, '2011-02-19'); 

SELECT ID, remind_date 
FROM 
(
    SELECT @prev_id := -1 
) AS vars 
STRAIGHT_JOIN 
(
    SELECT 
     ID, 
     remind_date, 
     @prev_id AS prev_id, 
     @prev_id := id 
    FROM table1 
    ORDER BY remind_date, ID 
) T1 
WHERE prev_id = 25 

结果:

 
ID remind_date 
48 2011-01-23 
+0

我有这样的数据集: [45 | 2011-01-14] [23 | 2011-01-22] [48 | 2011-01-23] [25 | 2011-01-23] [63 | 2011-02-19] it goes 45,23,25 ..跳过48。 任何其他的想法?? – Phil 2010-07-30 02:20:19

+0

@Phil:我已经用您在$ iid = 25的评论中提供的测试数据对它进行了测试,它工作正常,返回id = 48的记录。尝试在我更新的答案中运行提供的测试代码。你可以在MySQL Query Browser中运行它,看看它是否适用于你自己。我认为你的问题必须在你的代码中的其他地方。 – 2010-07-30 15:06:18

+0

马克, 你是对的!它确实有效。非常感谢你!你保存了许多现在留在我头上的头发;) – Phil 2010-08-09 16:55:46

0

添加条件在哪里ID <> MY_LAST_ID。这不能与三元多的相同日期的工作,这样你就可以收集已经采取ID的数组一样(4,5,6) - 见array_push(),与它发生内爆“”转换为一个字符串(姑且称之为YOUR_IDS_STRING ),并添加到您的查询:

WHERE id NOT IN(YOUR_IDS_STRING) 

而且每次查询化妆检查后,没有日期已经改变,如果这样做 - 你可以不设置你的阵列,并从begining开始(这不是neccesary,但给你更多的表现,因为YOUR_ID_STRING只会根据需要而定)。

如果您的页面在查询之间刷新,也许尝试在会话变量,_GET或cookie中推送YOUR_ID_STRING,然后简单地将下一个ID的操作符连接起来。=

0

我使用了由马克·拜尔斯提供的代码,并对其进行了小改动,使其适应了相反方向的导航(并通过其他列UMNS太多,不仅日期和ID):

$results = $mysqli->query("SELECT * FROM (SELECT @prev_id := -1) AS vars STRAIGHT_JOIN (SELECT *, @prev_id AS prev_id, @prev_id := ID FROM my_table ORDER BY data, ID) T1 WHERE prev_id = ".$ID);

$results = $mysqli->query("SELECT * FROM (SELECT @next_id := 1) AS vars STRAIGHT_JOIN (SELECT *, @next_id AS next_id, @next_id := ID FROM my_table ORDER BY data DESC, ID DESC) T1 WHERE next_id = ".$ID);

我测试的重复日期,将定位以及槽与显示的记录列表:

$results = $mysqli->query("SELECT * FROM my_table ORDER BY data DESC, ID DESC");