2009-12-10 89 views
4

假設你有一個表名爲'table_id'的整數主鍵選擇X「最接近」的ID?

是否有可能在單個查詢中提取具有特定ID的行,並且之前的X行和之後的X行?

對於爲例,如果你的ID是(1,2,8,12,16,120,250,354),X爲2,你有id爲16,選擇應以ID返回行8,12,16,120,250

我知道如何做到這一點與幾個查詢,我想知道這樣做在一次通過(子查詢,工會和一切都很好)。

感謝所有幫助

+0

ids是否總是按順序升序? – cherouvim 2009-12-10 19:55:13

+0

@cherouvim:關係(集合)理論不關心'排序'。你的問題在這個上下文中是不相關的(sql)。如果您需要使用ORDER BY子句的特定順序,那麼RDBMS將決定如何以指定順序最好地呈現所請求的數據集。 – 2009-12-11 12:42:14

回答

3

可以使之前的項目,該項目與聯盟之間的項目後,但你必須讓他們子目錄他們:

select * from (
    select * from thetable where table_id >= 16 order by table_id limit 3 
) x 
union all 
select * from (
    select * from thetable where table_id < 16 order by table_id desc limit 2 
) y 
order by table_id 
4

試試這個:

select table_id from table where id > 16 order by table_id desc limit 2 
union all 
select table_id from table where id <= 16 order by table_id asc limit 3; 
+1

這不應該是第二次「選擇前3名」嗎? – 2009-12-10 20:02:51

+0

注意mysql知道「限制」,而不是「頂部」 – 2009-12-10 20:02:54

+0

這個問題被標記爲「mysql」。 – 2009-12-10 20:10:37

0

使用MySQL的LIMIT語法和UNION:

SELECT table_id FROM table WHERE id > 16 ORDER BY table_id ASC LIMIT 2 
UNION 
SELECT table_id FROM table WHERE id <= 16 ORDER BY table_id DESC LIMIT 3 
+0

應該使用「union all」,而不是「union」 – 2009-12-10 20:03:27

+0

您不能以這種方式使用ORDER BY和UNION(或UNION ALL)。 – Guffa 2009-12-10 20:12:49

+1

錯誤1221:UNION和ORDER BY的使用不正確 – Guffa 2009-12-10 20:24:20

0

這使用派生的查詢工作在SQL Server:

DECLARE @X int, @target_id int 

SET @X = 2 
SET @target_id = 8 

SELECT [table_id] 
FROM 
(SELECT TOP ((@X * 2) + 1) [table_id] 
     ,ABS(@target_id - [table_id]) AS [Diff] 
    FROM [tblItems] 
    ORDER BY [Diff] ASC) T 
ORDER BY table_id ASC 
GO 
+1

根據需要,此功能無法工作。看起來你是這樣寫的:假定數字是連續的;而且這個要求很明確地排除了這一點。嘗試插入提供的示例數據。 – 2009-12-11 12:38:09

0

這是我會怎麼做,它的簡單,它適用於無/有符號數:如果您使用

-- Finds the closest 5 productID's to 200 
SELECT  productID, abs(productID - 200) as diff 
FROM  products 
WHERE  productID != 200 
ORDER BY diff, productID 
LIMIT  5 

無符號數,那麼你就需要轉換列第一:

-- Finds the closest 5 productID's to 200 (unsigned) 
SELECT  productID, abs(CAST(productID as SIGNED) - 200) as diff 
FROM  products 
WHERE  productID != 200 
ORDER BY diff, productID 
LIMIT  5 
+0

Arg!我完全誤解了這個問題。 – 2009-12-10 22:49:55

0

嘗試以下方法:不幸的是,我沒有的MySQL,但MS SQL v服務器ersion的作品。

SELECT /*TOP (2*2 +1) --MS SQL Server syntax */ 
     * 
FROM IDTable 
WHERE IDCol >= (
     SELECT MIN(IDCol) 
     FROM (
       SELECT /*TOP 2 --MS SQL Server syntax */ 
         IDCol 
       FROM IDTable 
       WHERE IDCol < 16 
       ORDER BY IDCol DESC limit 2 
       ) t 
     ) 
ORDER BY IDCol limit (2*2 +1)