SELECT SQL查询帮助

时间:2009-09-07 05:14:09

标签: sql mysql

我正试图找出一点点不寻常的选择查询。

首先,我所拥有的是表中单行的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**

等等。我希望现在更清楚了。

3 个答案:

答案 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;