Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL使用特定行进行排序和限制,并选择上一行和下一行_Php_Mysql_Sql_Database_Sorting - Fatal编程技术网

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

Php MYSQL使用特定行进行排序和限制,并选择上一行和下一行,php,mysql,sql,database,sorting,Php,Mysql,Sql,Database,Sorting,我有一个名为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

我有一个名为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。因此,在这种情况下,结果应该是这样的:

id | hops
1  | 3
3  | 5
由于没有低于1的id,因此没有更低的id符合标准,只选择了1个更高的id。错误的结果是因为使用了限制3,但我不能对每个条件使用限制。所以我根本不知道该怎么做

还有一个问题,是否使用子查询 从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

我想选择跳数较高或相等的id较高,跳数较低的id相同,因此不能仅剥离该部分…谢谢:我的意思是,标准是跳数相等或较高的id较高,跳数相等或较低的id较低…感谢:+1提出了书面问题。感谢Tom的努力,但还有另一个解决方案对我来说似乎更简单、更直截了当:没问题。随你喜欢的去吧。
-- 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