2013-04-01 27 views
3

我有一個簡單的表稱爲數據如下用戶:MYSQL排序和使用某行限制,選擇一個和下一個行

id | hops 
1 | 3 
2 | 1 
3 | 5 
4 | 2 
5 | 4 
6 | 5 

我想選擇任何給定的ID的跳數,我根據從最高到最低排序的跳數指定並選擇下一個和先前的ID。

解釋得我用下面的查詢:

SELECT * FROM test WHERE id = 1 
OR (id > 1 AND hops >= (SELECT hops FROM test WHERE id= 1)) 
OR (id < 1 AND hops <= (SELECT hops FROM test WHERE id= 1)) 
LIMIT 3 

所以在上面的查詢我試圖讓id=1,一張ID具有相同或更高的跳數,和以前的ID相同或跳數較少。

這是結果我得到:

id | hops 
1 | 3 
3 | 5 
5 | 4 

正如你可以看到它選擇的ID = 1級兩個較高的IDS,雖然我只想要一個更高的ID和一個低ID。所以,在這種情況下,結果應該是這樣的,而不是:

id | hops 
1 | 3 
3 | 5 

由於沒有低於1的ID,所以沒有降低到符合標準且只選擇1高ID。錯誤的結果是因爲使用了LIMIT 3,但我無法爲每個條件使用LIMIT。所以不知道如何解決這個問題。

還有一個問題,會使用子查詢 "SELECT hops FROM test WHERE id= 1" 減慢服務器大規模?我聽說使用子查詢並不可取,但除了使用單獨的查詢外沒有其他方法可以獲取此數字。

感謝

+0

對於寫得好的問題+1。 – Kermit

回答

3

在這裏你走,根據自己的喜好通過ID更改順序...如果你想跳的最接近數或最接近的ID,只是一個更大或更小

你不說
SELECT * FROM test 
WHERE id IN (1,(
    SELECT id FROM test WHERE id > 1 AND hops >= (
     SELECT hops FROM test WHERE id = 1 
     ) ORDER BY id LIMIT 1 
    ), (
    SELECT id FROM test WHERE id < 1 AND hops <= (
     SELECT hops FROM test WHERE id = 1 
     ) ORDER BY id DESC LIMIT 1 
)) 
+0

我想選擇較高的ID與更高或相同的跳數和相同的較低的ID,所以不能剝奪該部分...謝謝:) –

+0

我的意思是標準是一個更高的ID與相等或更高的數字啤酒花和更低的ID與相同或更低的跳數...謝謝:) –

1

如果我正確理解你的問題,我相信下面的工作。

-- Previous Rec 
SELECT t2.* 
FROM test as t1 
     JOIN test as t2 ON t2.hop <= t1.id 
WHERE t1.id = 1 
ORDER BY t2.id DESC 
LIMIT 1 

UNION ALL 

-- Current Rec 
SELECT * 
FROM test as t 
WHERE id = 1 

UNION ALL 

-- Following Rec 
SELECT t2.* 
FROM test as t1 
     JOIN test as t2 ON t2.id >= t1.hop 
WHERE t1.id = 1 
ORDER BY t2.id ASC 
LIMIT 1 
+0

感謝湯姆你的努力,但其他解決方案似乎更容易,更直接爲我:) –

+0

沒問題。隨你喜歡的去。 – Tom

相關問題