我想选择与我的表中的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。
我已经阅读了有关“周围行”的所有其他问题。但它们都处理一个结果,应包括周围的行。
答案 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
上述查询使用两次变量:一次为每条记录分配行号,第二次为过滤周围记录。