【问题标题】:MYSQL sorting and limit using a certain row and selecting previous and next rowsMYSQL排序和限制使用某一行并选择上一行和下一行
【发布时间】: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


【解决方案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
))

【讨论】:

  • 我想选择更高的 id,跳数更高或相等,低 id 也一样,所以不能只去掉那部分...谢谢 :)
  • 我的意思是标准是更高的 id 具有相同或更高的跃点数和更低的 id 具有相同或更少的跃点数...谢谢 :)
【解决方案2】:

如果我正确理解您的问题,我相信以下方法会起作用。

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

【讨论】:

  • 感谢 Tom 的努力,但其他解决方案对我来说似乎更简单、更直接:)
  • 没问题。随心所欲。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2020-02-21
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多