2009-09-07 78 views
1

我想弄清楚一点不寻常的选择查询。SELECT SQL查询帮助

首先,我拥有的是表中单个行的ID。我想从表中选择一些行(让我们说10)与单行与我知道在表中的行是在行集中。所以它会在我知道的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

你能提供的表列?你如何确定在行集中? – 2009-09-07 05:22:06

+0

嗯,这是根据我知道应该是中间行的id确定的。我在帖子中添加了更多信息。 – 2009-09-07 05:32:19

回答

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

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

他们不必是连续的。他们大多是但不时有超过+ 1的跳跃,因为该网站使用交易,他们有时失败。 – 2009-09-07 07:48:36

+0

如果MySQL支持ROW_NUMBER(),那么在ID中存在空隙时,它仍然不会太难。没有ROW_NUMBER,我想不出一个不使用游标或临时行数表的有效解决方案。 – 2009-09-07 21:13:46

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;