如果我为自动增量字段指定任何值,我如何获得下一个或上一个值?

时间:2010-11-15 16:04:14

标签: mysql

我有一个带有自动增量字段的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允许我从查询中提取多行?有更好的方法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

MIN()MAX()用于获取另一列中相同值组的列中的最小值或最大值。例如,获得学生的最低和最高成绩。你会GROUP BY学生的Id和MySQL会给你一行这两个值。

正如@AndreKR在他的回答中所示。 MIN()MAX()不会影响where语句。

我不完全确定你要做什么...为什么你只看第一行和最后15行。如果您在执行INSERT后尝试获取auto_increment使用的最后一个值,则可以运行此查询:

SELECT LAST_INSERT_ID();它将返回最后一个INSERT语句的ID(在该线程中!)。自动增量始终向上计数,因此不会重复使用已删除的行。下一个ID始终是LAST_INSERT_ID() + 1的值。

希望有所帮助。

答案 2 :(得分: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