【发布时间】:2013-03-22 22:58:00
【问题描述】:
我有一个名为 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"
大规模减慢服务器速度?我听说最好不要使用子查询,但是除了使用单独的查询之外,没有其他方法可以得到这个数字。
谢谢
【问题讨论】:
-
+1 写得很好的问题。
标签: php mysql sql database sorting