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