PHP-MYSQL使用特定的行进行排序和限制,并选择上一行和下一行

我有一个名为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和一个较低的ID,但它选择了id = 1和两个较高的id.因此,在这种情况下,结果应该是这样的:

id | hops
1  | 3
3  | 5

由于没有比1低的ID,因此没有更低的ID符合条件,并且仅选择1个更高的ID.错误的结果是因为使用了LIMIT 3,但我不能对每个条件都使用LIMIT.所以根本不知道该如何处理.

还有另一个问题,会使用子查询
“ SELECT跳自测试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
))
上一篇:java-使用整数和字符进行数组排序


下一篇:JavaScript自定义排序功能可对字母进行优先级排序