选择提供的ID之前和之后的第5条记录以及其他条件

jme*_*zes 1 mysql sql

我试图在表中提供的id之前和之后选择第5条记录,其数据如下所示.

我想到的是: select id-5, id+10 from devTable where id = 10 and stateCode = 'CA';

但是,考虑到stateCode,这实际上并没有给你提供id之前和之后的第5个id,它似乎只是将/ sub 5添加到提供的id.你知道如何以正确的方式做到这一点吗?

期望的结果

supplied id = 10 and stateCode = CA
prev | next
2    | 16

supplied id = 9 and stateCode = NY
prev | next
NULL | NULL
Run Code Online (Sandbox Code Playgroud)

数据

"id"  | "stateCode"
-------------------
"1"     "CA"
"2"     "CA"
"3"     "CA"
"4"     "CA"
"5"     "NY"
"6"     "NY"
"7"     "CA"
"8"     "CA"
"9"     "NY"
"10"    "CA"
"11"    "CA"
"12"    "NY"
"13"    "CA"
"14"    "CA"
"15"    "CA"
"16"    "CA"
Run Code Online (Sandbox Code Playgroud)

M K*_*aid 8

尝试使用UNION ALL两个查询,LIMIT其中6个为1,因为<=第二个为5

在id = 10之前和之后获得5条记录

(SELECT *  FROM devTable WHERE id <= 10 AND stateCode = 'CA' ORDER BY id DESC LIMIT 6)
UNION ALL
(SELECT *  FROM devTable WHERE id > 10 AND stateCode = 'CA' ORDER BY id ASC  LIMIT 5)
ORDER BY id
Run Code Online (Sandbox Code Playgroud)

在10之前看到5个记录的小提琴

在id = 10之前和之后获得第5条记录

(SELECT *  FROM devTable WHERE id < 10 AND stateCode = 'CA' ORDER BY id DESC LIMIT 4,1)
UNION ALL
(SELECT *  FROM devTable WHERE id > 10 AND stateCode = 'CA' ORDER BY id ASC  LIMIT 4,1)
ORDER BY id
Run Code Online (Sandbox Code Playgroud)

在10之前和之后看第5条记录的小提琴

显示记录行明智

SELECT 
(SELECT id  FROM devTable WHERE id < 10 AND stateCode = 'CA' ORDER BY id DESC LIMIT 4,1) AS `prev`,
(SELECT id  FROM devTable WHERE id > 10 AND stateCode = 'CA' ORDER BY id ASC  LIMIT 4,1) AS `next`
Run Code Online (Sandbox Code Playgroud)

在10行之前和之后显示第5条记录

该解决方案是不特定于5只记录它可用于第n个记录,以及

(SELECT 
  * 
FROM
  devTable 
WHERE id < 10 
  AND stateCode = 'CA' 
ORDER BY id DESC 
LIMIT (n - 1), 1) 

UNION ALL 

(SELECT 
  * 
FROM
  devTable 
WHERE id > 10 
  AND stateCode = 'CA' 
ORDER BY id ASC 
LIMIT (n - 1), 1) 
ORDER BY id 
Run Code Online (Sandbox Code Playgroud)