2010-11-15 82 views
1

我有一個自動增量字段的MySQL表,我想弄清楚如何使用純粹的MySQL獲得下一個或上一個值以及該行的其餘部分。該字段是AI,但數字不一定是連續的,因爲行一直被刪除。如果我爲自動增量字段指定了任何值,如何獲得下一個或上一個值?

FIELD_ID 8,15,17

這是我開始:

//to get next value in table: 
SELECT MIN(member_id) AS val FROM members WHERE member_id > 15 LIMIT 1 

//to get previous value in table: 
SELECT MAX(member_id) AS val FROM members WHERE member_id < 15 LIMIT 1 

但是,這只是返回member_id值。本工程以獲取下一個值(但不有所作爲,如果我使用DESC或ASC(WTF):

SELECT MIN(member_id),members.* 
AS val FROM members 
WHERE member_id > 15 
ORDER BY member_id DESC 
LIMIT 1 

該查詢逆轉(獲取以前的值)始終在返回的最低值表(1):

SELECT MAX(member_id),members.* 
FROM members 
WHERE member_id < 15 
ORDER BY member_id ASC 
LIMIT 1 

這兩個查詢,但是,表明我是想要什麼,但我其實並不完全知道爲什麼:

//get next LOWEST row 
SELECT MAX(member_id),members.* 
FROM members 
WHERE member_id < 15 
GROUP BY member_id  
ORDER BY member_id DESC 
LIMIT 1 

//get next HIGHEST row: 
SELECT MIN(member_id),members.* 
FROM members 
WHERE member_id > 15 
GROUP BY member_id  
ORDER BY member_id ASC 
LIMIT 1 

我假設GROUP BY讓我拉不止查詢中有一行是?有沒有更好的方法來做到這一點?

回答

2
//to get next value in table: 
SELECT * FROM members WHERE member_id > 15 ORDER BY member_id LIMIT 1 

//to get previous value in table: 
SELECT * FROM members WHERE member_id < 15 ORDER BY member_id DESC LIMIT 1 
0

那麼這很容易。感謝AndreKR,但小的校正:

//next value 
SELECT * FROM members WHERE member_id > 15 LIMIT 1 

//previous value 
SELECT * FROM members WHERE member_id < 15 ORDER BY member_id DESC LIMIT 1 
1

MIN()MAX()是獲得一列中的最小值或最大值爲在另一列中的基團相同的值。例如獲得學生的最低和最高等級。你會GROUP BY學生的ID和MySQL會給你一個單一的這兩個值。

As @AndreKR在他的回答中顯示。 MIN()MAX()不影響where語句。

我不完全確定你要做什麼...爲什麼你只看第一行和最後15行。如果您在執行INSERT後嘗試獲取auto_increment使用的最後一個值,則可以運行此查詢:

SELECT LAST_INSERT_ID();並且它將返回最後一條INSERT語句的ID(在該線程中!)。自動增量總是向上計數,因此不會重複使用已刪除的行。下一個ID始終爲LAST_INSERT_ID() + 1的值。

希望有所幫助。

+0

「我有一個帶有自動增量字段的MySQL表,我試圖弄清楚如何使用純粹的MySQL獲得下一個或上一個值以及該行的其餘部分。」這就是我想要做的。 15是我嘗試獲取下一個/ prev值的行的參考ID。 – 2010-11-15 22:38:13

相關問題