Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql-如何获取前一行的值和下一行的值?_Mysql_Sql - Fatal编程技术网

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.ide.id按id排序ASC限制1偏移量0作为下一个值 来自示例e 其中id=3;
如果要为所选记录的下一个和上一个值选择偏移量更高的记录,可以将自己的偏移量放在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