2009-09-07 82 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;