簡體   English   中英

MYSQL使用某一行進行排序和限制,並選擇上一行和下一行

[英]MYSQL sorting and limit using a certain row and selecting previous and next rows

我有一個名為users的簡單表,其中包含以下數據:

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和兩個更高的id,盡管我只想要一個更高的id和一個更低的id。 所以,在這種情況下,結果應該是這樣的:

id | hops
1  | 3
3  | 5

因為沒有低於1的id,所以沒有任何低於符合標准並且僅選擇1個更高的id。 錯誤的結果是因為使用LIMIT 3但我不能為每個條件使用LIMIT。 所以根本不知道如何處理這個問題。

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

謝謝

在這里,根據您的喜好按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
))

如果我正確理解您的問題,我相信以下內容將有效。

-- 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM