programing

ID 목록에 대한 여러 개의 주변 행 포함(ID순)

skycolor 2023. 9. 4. 19:39
반응형

ID 목록에 대한 여러 개의 주변 행 포함(ID순)

테이블에서 ID 목록과 일치하는 모든 행을 선택합니다(앞의 두 행과 뒤의 두 행 포함).아이디순으로주문했습니다.

 ID | Value
 ---+----------
  1 | Value #1
  2 | Value #2
  3 | Value #3
  4 | Value #4
  5 | Value #5
  6 | Value #6
  7 | Value #7
  8 | Value #8
  9 | Value #9
 10 | Value #10
 11 | Value #11
 12 | Value #12
 13 | Value #13
 14 | Value #14
 17 | Value #17
 19 | Value #19
 20 | Value #20
 28 | Value #28
 29 | Value #29
 30 | Value #30

이제 질문이 있습니다.

 SELECT `ID`, `Value` FROM `table` WHERE `ID` in (5, 14) ORDER BY `ID`;

ID 3, 4, 6, 7, 12, 13, 17, 19도 반납하려면 어떻게 연장해야 합니까?정확한 신원은 모릅니다테이블에 틈이 있을 수 있습니다.5가 일치하지 않는 경우 3, 4, 6, 7보다 큰 값은 반환되지 않습니다.

저는 이미 "주변 행"과 관련된 다른 모든 질문을 읽었습니다.그러나 이들은 모두 주변 행을 포함해야 하는 하나의 결과를 처리하고 있습니다.

다음 쿼리를 사용할 수 있습니다.

SELECT ID, Value
FROM (
   SELECT ID, Value,
          @rn1 := @rn1 + 1 AS rn
   FROM mytable
   CROSS JOIN (SELECT @rn1 := 0) AS v
   ORDER BY ID) AS t1
JOIN (
   SELECT rn
   FROM (
      SELECT ID, Value,
             @rn := @rn + 1 AS rn
      FROM mytable
      CROSS JOIN (SELECT @rn := 0) AS v
      ORDER BY ID) AS t
   WHERE t.ID IN (5, 14)  
) AS t2 ON t1.rn  BETWEEN t2.rn - 2 AND t2.rn + 2  

위 쿼리는 변수를 두 번 사용합니다. 한 번은 각 레코드에 행 번호를 할당하고 두 번째는 주변 레코드를 필터링하기 위해 사용합니다.

여기서 데모

언급URL : https://stackoverflow.com/questions/39464112/include-multiple-surrounding-rows-for-a-list-of-ids-ordered-by-id

반응형