MYSQL查询获取给定行附近的'n'行

Luc*_*ari 6 mysql sql

我有一个名为'videos'的MySQL表,其中一列是'cat'(INT),'id'是PRIMARY KEY.

因此,如果'x'是行号,'n'是类别ID,我需要得到附近的 15行

案例1:'x'之前和之后的类别中有很多行.只需在'x'之前和之后获得7行

SELECT * FROM videos WHERE cat=n AND id<x ORDER BY id DESC LIMIT 0,7
SELECT * FROM videos WHERE cat=n AND id>x LIMIT 0,7
Run Code Online (Sandbox Code Playgroud)

情况2:如果'x'在表的开头/结尾 - >打印全部(假设'y'行)'x'之前/之后的行,然后在'x'之前/之后打印15-y行

案例1不是问题,但我遇到了案例2.是否有任何通用的方法在'x'行附近获得'p'行?

Ric*_*iwi 5

该查询将总是在数据的中心位置N(精确ID匹配),除非有没有更多的行(在任一方向),在这种情况下的行将从根据需要现有/下一节加入,同时仍保留数据从上一个/下一个(尽可能多).

set @n := 28;

SELECT * FROM
(
SELECT * FROM
(
    (SELECT v.*, 0 as prox  FROM videos v WHERE cat=1 AND id = @n)
    union all
    (SELECT v.*, @rn1:=@rn1+1 FROM (select @rn1:=0) x, videos v WHERE cat=1 AND id < @n ORDER BY id DESC LIMIT 15)
    union all
    (SELECT v.*, @rn2:=@rn2+1 FROM (select @rn2:=0) y, videos v WHERE cat=1 AND id > @n ORDER BY id LIMIT 15)
) z
ORDER BY prox
LIMIT 15
) w
order by id
Run Code Online (Sandbox Code Playgroud)

例如,如果你有cat = 1的30个id,而你正在查看项目#28,它将显示项目16到30,#28是从底部开始的第3行.

一些解释:

SELECT v.*,0作为代理 FROM视频v WHEREcat = 1 AND id = @n

  • v.*表示选择表/别名v中的所有列.在这种情况下,v是表视频的别名.
  • 0作为prox意味着创建一个名为prox的列,它只包含值0

下一个查询:
SELECT v.*,@ rn1:= @ rn1 + 1 FROM (选择@ rn1:= 0)x,视频v WHEREcat = 1 AND id <@n ORDER BYid DESC LIMIT15

  • v.* - 如上所述
  • @ rn1:= @ rn1 + 1使用变量返回此子查询中每条记录的序列号.它从1开始,对于每个记录,在ORDER BY id DESC它之后,它将编号为2,然后是3等.
  • (select @ rn1:= 0)x这会创建一个别名为x的子查询,它所做的只是确保变量@ rn1以第一行的值1开始.

最终结果是变量和0作为 ranks每行的近似,基于它与值@n的接近程度.该子句order by prox limit 15取最接近N的15.