包含多个周围行以获取ID列表(按ID排序)

时间:2016-09-13 07:09:44

标签: mysql mariadb

我想选择与我的表中的id列表匹配的所有行,包括之前的2行和之后的2行。按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?我不知道确切的ID。表格中可能存在差距。如果5不匹配,则不应返回3,4,6和7。

我已经阅读了有关“周围行”的所有其他问题。但它们都处理一个结果,应包括周围的行。

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询:

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  

上述查询使用两次变量:一次为每条记录分配行号,第二次为过滤周围记录。

Demo here