假設你有一個表名爲'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
我知道如何做到這一點與幾個查詢,我想知道這樣做在一次通過(子查詢,工會和一切都很好)。
感謝所有幫助
假設你有一個表名爲'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
我知道如何做到這一點與幾個查詢,我想知道這樣做在一次通過(子查詢,工會和一切都很好)。
感謝所有幫助
可以使之前的項目,該項目與聯盟之間的項目後,但你必須讓他們子目錄他們:
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
試試這個:
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;
這不應該是第二次「選擇前3名」嗎? – 2009-12-10 20:02:51
注意mysql知道「限制」,而不是「頂部」 – 2009-12-10 20:02:54
這個問題被標記爲「mysql」。 – 2009-12-10 20:10:37
使用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
這使用派生的查詢工作在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
根據需要,此功能無法工作。看起來你是這樣寫的:假定數字是連續的;而且這個要求很明確地排除了這一點。嘗試插入提供的示例數據。 – 2009-12-11 12:38:09
這是我會怎麼做,它的簡單,它適用於無/有符號數:如果您使用
-- 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
Arg!我完全誤解了這個問題。 – 2009-12-10 22:49:55
嘗試以下方法:不幸的是,我沒有的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)
ids是否總是按順序升序? – cherouvim 2009-12-10 19:55:13
@cherouvim:關係(集合)理論不關心'排序'。你的問題在這個上下文中是不相關的(sql)。如果您需要使用ORDER BY子句的特定順序,那麼RDBMS將決定如何以指定順序最好地呈現所請求的數據集。 – 2009-12-11 12:42:14