2010-07-29 63 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");

相關問題