select U.*
from tab_users U
join (
select counter,id from tab_users
where counter >= (select counter from tab_users where id=@my_id)
order by (id=@my_id), counter limit 1
) P
on U.counter < P.counter
or (U.counter >= P.counter and U.id in(P.id, @my_id))
order by (U.id!=P.id), U.counter desc
limit 3
P 子查询获取评分大于或等于主帖子(“我”)的帖子的评分和 id。在这种情况下,如果有多个记录与主要记录具有相同的评分,则除主要记录外,将采用其中任何记录。如果没有找到更高或相同等级的记录,则将采用主要记录。
之后,为子查询选择所有评分较低或相等的记录。此外,如果评分相等,那么您需要准确地获取一条记录,其 id 是在 P 子查询或主查询中找到的。对记录进行排序,以便子查询 P 中的记录必然是第一个。
使用这种方法,主要条目位于中间。如果主条目的评分最高(“我是前 1”),我们还将获得 3 个条目,而主条目将是第一个。如果主记录位于评分的最底部,则查询仅返回 2 条记录——前一条和主一条(如果此时不适合您,您仍然需要使用 P 子查询的条件来获取此案例的另一条备份记录)。
select *
from (
select *, @n:=@n+1 num, @my_num:=if(id=@my_id,@n,@my_num)
from tab_users, (select @n:=0, @my_num:=0) x
order by counter
) X
where num between @my_num-1 and @my_num+1
MySQL 中的查询结果相当不平凡:
P 子查询获取评分大于或等于主帖子(“我”)的帖子的评分和 id。在这种情况下,如果有多个记录与主要记录具有相同的评分,则除主要记录外,将采用其中任何记录。如果没有找到更高或相同等级的记录,则将采用主要记录。
之后,为子查询选择所有评分较低或相等的记录。此外,如果评分相等,那么您需要准确地获取一条记录,其 id 是在 P 子查询或主查询中找到的。对记录进行排序,以便子查询 P 中的记录必然是第一个。
使用这种方法,主要条目位于中间。如果主条目的评分最高(“我是前 1”),我们还将获得 3 个条目,而主条目将是第一个。如果主记录位于评分的最底部,则查询仅返回 2 条记录——前一条和主一条(如果此时不适合您,您仍然需要使用 P 子查询的条件来获取此案例的另一条备份记录)。
sqlfiddle.com上的示例
选项 2:对所有记录进行编号并通过编号找到您需要的记录:
使它非常弯曲,但它有效。
感谢那些愿意提供帮助的人!