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符合条件,只选择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