我正试图找出一点点不寻常的选择查询。
首先,我所拥有的是表中单行的id。我想从表中选择一些行(比如说10),其中单行的id我知道在表中位于行集的中间。所以它会在我知道的id之前选择4行,在id(或5,4)之后选择5行。
如果id在表的开头或结尾,如果表仍然选择10行,那么例如如果id是表中的第二行,它将在它之前选择1行和8行在它之后。当id是最后一行时,它将在它之前选择9行(当然还有带有id的行)。
我不确定我是否足够清楚,但我无法以更好的方式解释这一点。
编辑:
以下是更多信息。想象一下这样的表(简化):
id title
1 Title 1
2 Title 2
3 Title 3
4 Title 4
5 Title 5
6 Title 6
7 Title 7
8 Title 8
9 Title 9
10 Title 10
11 Title 11
12 Title 12
13 Title 13
14 Title 14
15 Title 15
16 Title 16
17 Title 17
18 Title 18
19 Title 19
20 Title 20
21 Title 21
22 Title 22
23 Title 23
24 Title 24
25 Title 25
现在假设我的id是11,然后查询将选择这些行:
7, 8, 9, 10, **11**, 12, 13, 14, 15, 16
假设id为2,查询将选择:
1, **2**, 3, 4, 5, 6, 7, 8, 9, 10
假设id为25,查询将选择:
16, 17, 18, 19, 20, 21, 22, 23, 24, **25**
等等。我希望现在更清楚了。
答案 0 :(得分:2)
declare @p_id numeric, @p_range numeric
select @p_id = 4 -- known ID
, @p_range = 10 --range
select * from myTable
where id between (@p_id - (@p_range / 2)) and (@p_id + (@p_range / 2))
order by id
这将在已知ID(4),5之前,之后5之后选择10条记录。
如果你想拥有10条记录,你需要做更多的操作,并计算出前后有多少记录(在id = 2的情况下等)
答案 1 :(得分:1)
我不是MySQL人,但如果ID是连续且不间断的话,这可能会有效:
select ID, your_other_columns from (
select
:yourID-ID+0.5 as priority,
* from T where ID between :yourID-9 and :yourID
union all
select
ID-:yourID as priority,
* from T where ID between :yourID and :yourID+9
where ID >= :yourID and :yourID >= ID-9
) as T20 order by priority limit 10;
答案 2 :(得分:1)
单个查询......有点难看;)
SET @target := 11
(SELECT *
FROM (
(SELECT * FROM your_table WHERE id <= @target ORDER BY id desc LIMIT 10)
UNION
(SELECT * FROM your_table WHERE id > @target ORDER BY id asc LIMIT 9)
) AS u ORDER BY ABS(CAST(u.id AS signed integer) - @target) ASC LIMIT 10
) ORDER BY id;