복붙노트

[SQL] MySQL은 - 어떻게 다음 행에서 이전 행과 가치의 가치를 얻을? [복제]

SQL

MySQL은 - 어떻게 다음 행에서 이전 행과 가치의 가치를 얻을? [복제]

나는 예 이름 다음 표를 가지고 :

id(int 11) //not autoincriment
value (varchar 100)

그것은 다음과 같은 데이터 행이 있습니다 :

0  100
2  150
3  200
6  250
7  300

해당 ID의 값이 연속하지 않습니다.

지금까지이 SQL을 작성했습니다 :

SELECT * FROM Example WHERE id = 3

그러나, 나는 이전의 ID와 다음 ID 값의 값을 취득하는 방법을 모른다 ...

내가 이전 값과 다음 값 ID = 3 경우를 얻을 도와주세요?

P.S는 : 내 예에는 다음과 같습니다 이전 - 150, 다음 - 250.

해결법

  1. ==============================

    1.다음 행을 아래에서 선택 :

    다음 행을 아래에서 선택 :

    SELECT * FROM Example WHERE id < 3 ORDER BY id DESC LIMIT 1
    

    다음 행을 위의 선택 :

    SELECT * FROM Example WHERE id > 3 ORDER BY id LIMIT 1
    

    한 쿼리에서 모두를 선택, 예를 들어, UNION을 사용합니다 :

    (SELECT * FROM Example WHERE id < 3 ORDER BY id DESC LIMIT 1)
     UNION
    (SELECT * FROM Example WHERE id > 3 ORDER BY id LIMIT 1)
    

    그건 당신이 무엇을 의미?

  2. ==============================

    2.해결책은 임시 변수를 사용하는 것입니다 :

    해결책은 임시 변수를 사용하는 것입니다 :

    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
    

    SQL 바이올린의 예를 확인

    잔인한있다, 그러나 당신을 도움이 될 수 있습니다

  3. ==============================

    3.이 sqlFiddle을 시도하십시오

    이 sqlFiddle을 시도하십시오

    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
    

    편집 : 코드가 여기에있다, 그래서 이전의 ID와 의견 중 하나에 다음 ID의 값을 잡아 값으로 언급 OP SQLFiddle

    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
    
  4. ==============================

    4.

    SELECT *,
           (SELECT value FROM example e1 WHERE e1.id < e.id ORDER BY id DESC LIMIT 1 OFFSET 0) as prev_value,
           (SELECT value FROM example e2 WHERE e2.id > e.id ORDER BY id ASC LIMIT 1 OFFSET 0) as next_value
    FROM example e
    WHERE id=3;
    

    그리고 당신은 당신이 선택한 레코드에서 다음 및 이전 값에 대한 높은 오프셋 레코드를 선택하려면 OFFSET 키워드의 뒤의 오프셋 (offset)를 직접 배치 할 수 있습니다.

  5. ==============================

    5.여기 내 솔루션을 맞게 할 수있다 :

    여기 내 솔루션을 맞게 할 수있다 :

    SELECT * FROM Example
    WHERE id IN (
    (SELECT MIN(id) FROM Example WHERE id > 3),(SELECT MAX(id) FROM Example WHERE id < 3)
    )
    

    데모 : http://sqlfiddle.com/#!9/36c1d/2

  6. ==============================

    6.당신은 하나의 행에 모든 필요한 경우 가능한 솔루션

    당신은 하나의 행에 모든 필요한 경우 가능한 솔루션

    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 |
    

    여기 SQLFiddle 데모입니다

  7. ==============================

    7.이 쿼리는 원하는 결과를 얻을 수있는 대상 ID의 거리, 그리고 래퍼 일련의 쿼리를 계산하는 사용자 정의 변수를 사용합니다. 그것을 잘 수행해야하므로 하나 개의 패스 테이블을 통해 이루어진다.

    이 쿼리는 원하는 결과를 얻을 수있는 대상 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
    

    SQLFiddle 참조

    당신이 마지막 행 순서에 대한 상관 없어 경우에 당신은 가장 바깥 쪽 래퍼 쿼리를 생략 할 수 있습니다.

  8. ==============================

    8.당신은 ID가없는 경우이 나를 위해 일했다.

    당신은 ID가없는 경우이 나를 위해 일했다.

    다음:

    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
    

    나는 검색 멤버의 마지막 이름에 회원 목록을 사용합니다. 만큼 당신이 현재 레코드에서 데이터를 가지고 그것을 잘 작동합니다.

  9. from https://stackoverflow.com/questions/20849098/mysql-how-get-value-in-previous-row-and-value-in-next-row by cc-by-sa and MIT license