MySql-如何获取前一行的值和下一行的值?
我有下表,命名为示例: 它具有以下数据行:MySql-如何获取前一行的值和下一行的值?,mysql,sql,Mysql,Sql,我有下表,命名为示例: 它具有以下数据行: 0 100 2 150 3 200 6 250 7 300 请注意,id值不是连续的 到目前为止,我已经编写了以下SQL: SELECT * FROM Example WHERE id = 3 但是,我不知道如何获取上一个id的值和下一个id的值 如果id=3,请帮助我获取上一个值和下一个值 注意:在我的示例中,它将是:previous-150,next-250。选择下面的下一行: SELECT * FROM Example WHERE
0 100
2 150
3 200
6 250
7 300
请注意,id值不是连续的
到目前为止,我已经编写了以下SQL:
SELECT * FROM Example WHERE id = 3
但是,我不知道如何获取上一个id的值和下一个id的值
如果id=3,请帮助我获取上一个值和下一个值
注意:在我的示例中,它将是:previous-150,next-250。选择下面的下一行:
SELECT * FROM Example WHERE id < 3 ORDER BY id DESC LIMIT 1
在一个查询中同时选择这两个选项,例如使用:
这就是你的意思?解决方案是使用临时变量:
select
@prev as previous,
e.id,
@prev := e.value as current
from
(
select
@prev := null
) as i,
example as e
order by
e.id
要获取下一个值,请重复此过程。以下是一个例子:
select
id, previous, current, next
from
(
select
@next as next,
@next := current as current,
previous,
id
from
(
select @next := null
) as init,
(
select
@prev as previous,
@prev := e.value as current,
e.id
from
(
select @prev := null
) as init,
example as e
order by e.id
) as a
order by
a.id desc
) as b
order by
id
检查
这可能有些过分,但如果您需要将所有内容放在一行中,它可能会帮助您找到一个可能的解决方案
SELECT t.id, t.value, prev_id, p.value prev_value, next_id, n.value next_value
FROM
(
SELECT t.id, t.value,
(
SELECT id
FROM table1
WHERE id < t.id
ORDER BY id DESC
LIMIT 1
) prev_id,
(
SELECT id
FROM table1
WHERE id > t.id
ORDER BY id
LIMIT 1
) next_id
FROM table1 t
WHERE t.id = 3
) t LEFT JOIN table1 p
ON t.prev_id = p.id LEFT JOIN table1 n
ON t.next_id = n.id
样本输出:
| ID | VALUE | PREV_ID | PREV_VALUE | NEXT_ID | NEXT_VALUE |
|----|-------|---------|------------|---------|------------|
| 3 | 200 | 2 | 150 | 4 | 250 |
这是演示请试试这个
此查询使用用户定义的变量来计算与目标id的距离,并使用一系列包装器查询来获得所需的结果。只有一次传球越过了桌子,所以它应该表现得很好
select * from (
select id, value from (
select *, (@x := ifnull(@x, 0) + if(id > 3, -1, 1)) row from (
select * from mytable order by id
) x
) y
order by row desc
limit 3
) z
order by id
见
如果不关心最后的行顺序,可以省略最外层的包装器查询。SELECT*,
从示例e1中选择值,其中e1.id如果要为所选记录的下一个和上一个值选择偏移量更高的记录,可以将自己的偏移量放在offset关键字之后。我的解决方案可能适合您:
SELECT * FROM Example
WHERE id IN (
(SELECT MIN(id) FROM Example WHERE id > 3),(SELECT MAX(id) FROM Example WHERE id < 3)
)
演示:如果您没有ID,这对我来说很有效 下一步: 以前的:
SELECT * FROM table_name
WHERE column_name < current_column_data
ORDER BY column_name DESC
LIMIT 1
我将其用于成员列表,其中搜索位于成员的姓氏上。只要您拥有当前记录中的数据,它就可以正常工作。您想要一行还是三行中的值?不是向下的投票者,但您尝试了什么,为什么要这样做?@SlyRaskal抱歉,我更新问题now@Bohemian例如,我的id=3未自动加入,现在我想获取上一个id的值和下一个id的值。@SlyRaskal i updatequestion@Strawberry欢迎随时提供更好的答案!我有同样的问题,我想要最好的答案,所以最后我发现这个答案在我的案例中非常有效,我在这里分享了它,希望它能帮助别人更容易地找到最好的答案。如果你这么说的话。我认为最上面的答案比这个好。@草莓我尊重你的选择,但在某些情况下,例如当你想从两行中求差或计算时,我的答案更有助于在同一行上进行计算。@草莓假设一本书的章节!如果您想要显示当前章节中的页数,例如,如果您有一个带有章节id和章节页码的表,该怎么办!计算公式为下一章页码-章页码。你还是用最上面的答案吗?如果是这样的话,那怎么办呢?如果你有问题,建议你问一个问题——用合适的DDL和期望的结果!问题,当行不在选定列中时,按行排序是如何工作的?@ejay在所有数据库中,您可以按未选定的表达式排序看起来非常乏味,但实际上它是最快的。。我将其与其他解决方案进行了比较,嗯,在我的表中,大约有16000行,使用变量的替代方案MySQL 5.5-0.09s比17s快得多!这个答案比较灵活。无论如何,您实际上不想按ID排序。我使用的UUID不可排序。我可以将“value”替换为“sequence”,并收紧内部选择以从Postgres中获得正确的上一行/下一行。这是一个很好的选择y@Barranka它不再工作了。您可以使用MySQL 5.6在SQL FIDLE上检查它。“上一个”和“下一个”显示一些Blob值,而不是正确的值。通过将第二行替换为:id、CONVERTprevious使用utf8、current、CONVERTnext使用utf8来修复此问题。请注意,如果查询以某种方式包含组,则变量的计算方式会有所不同,这将不起作用。您需要包装您的查询。
SELECT value,
(SELECT value FROM example e2
WHERE e2.value < e1.value
ORDER BY value DESC LIMIT 1) as previous_value,
(SELECT value FROM example e3
WHERE e3.value > e1.value
ORDER BY value ASC LIMIT 1) as next_value
FROM example e1
WHERE id = 3
SELECT value,
(SELECT value FROM example e2
WHERE e2.id < e1.id
ORDER BY id DESC LIMIT 1) as previous_value,
(SELECT value FROM example e3
WHERE e3.id > e1.id
ORDER BY id ASC LIMIT 1) as next_value
FROM example e1
WHERE id = 3
select * from (
select id, value from (
select *, (@x := ifnull(@x, 0) + if(id > 3, -1, 1)) row from (
select * from mytable order by id
) x
) y
order by row desc
limit 3
) z
order by id
SELECT * FROM Example
WHERE id IN (
(SELECT MIN(id) FROM Example WHERE id > 3),(SELECT MAX(id) FROM Example WHERE id < 3)
)
SELECT * FROM table_name
WHERE column_name > current_column_data
ORDER BY column_name ASC
LIMIT 1
SELECT * FROM table_name
WHERE column_name < current_column_data
ORDER BY column_name DESC
LIMIT 1