选择周围的行php/mysql

选择周围的行php/mysql,php,mysql,select,neighbours,Php,Mysql,Select,Neighbours,我想在条件匹配的行周围选择一组行,即选择一行,然后返回前后5条记录 更多信息请按要求抱歉 好的,表格记录了一场比赛的圈数。圈数与用户相关,用户有很多圈数。我想找到一个用户的最佳圈速,然后从唯一用户的x个最佳圈数上面和下面的要求用户的最佳圈数 这可能吗?鉴于数据非常稀疏,我只能提供一个非常通用的解决方案。将其视为灵感: SELECT id, fieldX, ABS(id - <id-to-select>) AS distance FROM table W

我想在条件匹配的行周围选择一组行,即选择一行,然后返回前后5条记录

更多信息请按要求抱歉

好的,表格记录了一场比赛的圈数。圈数与用户相关,用户有很多圈数。我想找到一个用户的最佳圈速,然后从唯一用户的x个最佳圈数上面和下面的要求用户的最佳圈数


这可能吗?

鉴于数据非常稀疏,我只能提供一个非常通用的解决方案。将其视为灵感:

SELECT
    id,
    fieldX,
    ABS(id - <id-to-select>) AS distance
FROM
    table
WHERE
    ABS(id - <id-to-select>) < 5
ORDER BY
    distance DESC
但是,此方法不能保证返回id为的行。它只返回最靠近此ID的行


同样,这只是一个灵感来源。

所以我假设你想按圈速排序


SELECT `lap_time`, `uid` 
FROM `table`
WHERE `uid` = x AND `lapnum` = y
这将获得最后一圈的成绩。假设它存储为INT,以秒为单位。结果是120

现在选择更快的所有圈速


SELECT `lap_time`, `uid` 
FROM `table`
WHERE `laptime` =< 120
GROUP BY `uid`
ORDER BY `laptime` DESC
LIMIT 5 

这将为您提供所需的所有11行

这花了相当多的时间进行黑客攻击,但它似乎在我这边起作用


SELECT *
FROM `lap_times`
WHERE `id` IN (
    SELECT * FROM (
        SELECT lt1.id
        FROM `lap_times` lt1
        WHERE lt1.time = (SELECT MIN(lt2.time) FROM `lap_times` lt2 WHERE lt2.user_id = lt1.user_id)
        AND lt1.time <= (SELECT MIN(lt3.time) FROM `lap_times` lt3 WHERE lt3.user_id = 2)
        AND lt1.user_id != 2
        ORDER BY lt1.time ASC
        LIMIT 5
    ) AS `tbl1`
) OR `id` = (
    SELECT `id`
    FROM `lap_times`
    WHERE `user_id` = 2
    ORDER BY `time` ASC
    LIMIT 1
) OR `id` IN (
    SELECT * FROM (
        SELECT lt1.id
        FROM `lap_times` lt1
        WHERE lt1.time = (SELECT MIN(lt2.time) FROM `lap_times` lt2 WHERE lt2.user_id = lt1.user_id)
        AND lt1.time >= (SELECT MIN(lt3.time) FROM `lap_times` lt3 WHERE lt3.user_id = 2)
        AND lt1.user_id != 2
        ORDER BY lt1.time ASC
        LIMIT 5
    ) AS `tbl2`
)
ORDER BY `time` ASC;

这实际上只是对PHP Steven的回答的更正,但我没有足够的代表发表评论

SELECT `lap_time`, `uid` 
FROM `table` t1
WHERE `lap_time` =< 120
AND NOT EXISTS (SELECT 1 FROM `table`
                 WHERE `uid` = t1.`uid` AND `lap_time` > t1.`lap_time` AND `lap_time` < 120)
ORDER BY `lap_time` DESC
LIMIT 5


唯一的区别是NOT EXISTS子句用于消除同一用户的二次圈速。否则,您将获得下一个最慢和最快的圈速,但不会获得下一个最慢/最快的唯一用户。

它应该类似于:

lap_time = column with lap times (assumed to be an int or numeric)
laps = table containing lap times
CURRENT_LAP_TIME = the lap time in question
然后


您可以将整个内容包装在另一个SELECT语句中,并根据需要按特定顺序进行排序。我认为有一种更好的方法可以反转第一个SELECT语句,但我无法马上想到它。

请发布您的查询和表结构或示例数据。前面和后面的行是否必须满足原始SELECT条件,或者只是在原始表格中选定行的前面和后面?请同时指定排序标准的前后含义。其他用户是否可以拥有与所需用户完全相同的圈速?如果是这样,它们应该被包括在“上面”列表还是“下面”列表中,或者根本不包括?这可能会为单个用户返回多个圈记录。要求返回具有最佳圈速的唯一用户列表。谢谢@vincebowdren。我添加了一个GROUP BY来解决该问题。
SELECT `lap_time`, `uid` 
FROM `table` t1
WHERE `lap_time` > 120
AND NOT EXISTS (SELECT 1 FROM `table`
                 WHERE `uid` = t1.`uid` AND `lap_time` < t1.`lap_time` AND `lap_time` > 120)
ORDER BY `lap_time` DESC
LIMIT 5
lap_time = column with lap times (assumed to be an int or numeric)
laps = table containing lap times
CURRENT_LAP_TIME = the lap time in question
SELECT lap_time FROM laps
WHERE lap_time < CURRENT_LAP_TIME
ORDER BY lap_time DESC LIMIT 5
UNION
SELECT lap_time FROM laps
WHERE lap_time >= CURRENT_LAP_TIME
ORDER BY lap_time LIMIT 6