选择SQL查询帮助

选择SQL查询帮助,sql,mysql,Sql,Mysql,我试图找出一个有点不寻常的select查询 首先,我拥有的是表中一行的id。我想从表中选择若干行,让10行加上一行,其中我知道的ID在行集中中间的表中。因此,它将选择我知道的id之前的4行和id之后的5行或5,4 如果id位于表的开头,或者如果表仍然选择10行,则id位于表的末尾,因此,例如,如果id是表中的第二行,则它将选择它前面的1行和后面的8行。当id是最后一行时,它将选择它前面的9行加上带有id的一行 我不确定我是否足够清楚,但我很难用更好的方式解释这一点 编辑: 这里有更多的信息。想象

我试图找出一个有点不寻常的select查询

首先,我拥有的是表中一行的id。我想从表中选择若干行,让10行加上一行,其中我知道的ID在行集中中间的表中。因此,它将选择我知道的id之前的4行和id之后的5行或5,4

如果id位于表的开头,或者如果表仍然选择10行,则id位于表的末尾,因此,例如,如果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
16, 17, 18, 19, 20, 21, 22, 23, 24, **25**
假设id为25,查询将选择:

1, **2**, 3, 4, 5, 6, 7, 8, 9, 10
16, 17, 18, 19, 20, 21, 22, 23, 24, **25**
等等。我希望现在更清楚了

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的情况下,计算出前后有多少条记录,等等

这将在已知ID 4、5之前、5之后选择10条记录


如果你想要有10条记录,你需要做更多的操作,并且在id=2的情况下计算出前后有多少条记录,等等,我不是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;

我不是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;

单一查询。。。有点难看

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;

单一查询。。。有点难看

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;

你能提供表列吗?您如何确定是否在行集中?嗯,这是根据我知道的中间行id确定的。我在我的帖子中添加了更多信息。你能提供表列吗?您如何确定是否在行集中?嗯,这是根据我知道的中间行id确定的。我已经在我的帖子中添加了更多信息。它们不必是连续的。大多数情况下是这样的,但有时会有超过+1的跳跃,因为网站使用事务,有时会失败。如果MySQL支持行数,那么ID中的空白也不会太难。如果没有行号,我想不出一个不使用游标或临时行号表的有效解决方案。它们不必是连续的。大多数情况下是这样的,但有时会有超过+1的跳跃,因为网站使用事务,有时会失败。如果MySQL支持行数,那么ID中的空白也不会太难。如果没有行编号,我想不出一个不使用游标或临时行编号表的有效解决方案。