我有一张桌子:
table (
pk int auto_increment,
ctx int not null,
msg text not null
)
我想选择,给定一些PK,之前是10行,之后是10行。问题是,我不能依赖PK(选择*来自pk< v_pk和pk> v_pk-10的表),因为它们不相邻,可能有一行与结果无关,鉴于' ctx'。
谢谢!
答案 0 :(得分:1)
你可以试试这个:
(select t.*
from table t.*
where pk <= YOURVALUE
order by pk desc
limit 11
) union all
(select t.*
from table t.*
where pk > YOURVALUE
order by pk asc
limit 10
)
order by
不应该排序,因为您是按主键排序的。
答案 1 :(得分:0)
我知道没有简单的方式“在值的任一侧获取n行”。关系数据库是基于设置而非基于位置的。
您可以尝试这样的事情:
SELECT *
FROM SO25110036 as a
WHERE
a.pk = 11
OR
(
a.pk < 11
and 3 >=
(select count(*)
from SO25110036 as b
where b.pk >= a.pk
and b.pk < 11
)
)
OR
(
a.pk > 11
and 3 >=
(select count(*)
from SO25110036 as c
where c.pk <= a.pk
and c.pk > 11
)
)
order by pk
;
我在这里实施了一个小提琴:http://sqlfiddle.com/#!7/b4595/4
出于测试目的,它在行的任一侧获得3行,具有11值,以及该行。另外,请尝试不使用ORDER BY
。
使用sqlite特定语法可能有更好的解决方案,但我不是sqlite用户。