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