我试图在表中提供的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)
尝试使用UNION ALL两个查询,LIMIT其中6个为1,因为<=第二个为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)
(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)
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)
该解决方案是不特定于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)