我有一个名为'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'行?
该查询将总是在数据的中心位置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
下一个查询:
SELECT v.*,@ rn1:= @ rn1 + 1 FROM (选择@ rn1:= 0)x,视频v WHEREcat = 1 AND id <@n ORDER BYid DESC LIMIT15
ORDER BY id DESC它之后,它将编号为2,然后是3等.最终结果是变量和0作为 ranks每行的近似,基于它与值@n的接近程度.该子句order by prox limit 15取最接近N的15.
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |