我有一个名为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
))