我有一个包含3个字段的表,即用于存储上传文件的id,filename和prev_id
Id | filename | prev_id
---------------------------
1 | file1 | NULL
2 | file2 | 1
3 | file3 | 2
4 | file4 | NULL
5 | file5 | 4
6 | file6 | 5
file3是最新上传的文件,而其他文件是上一个以prev_id标注的文件。我想要一个查询列出file3的先前文件。同样明智的另一个新上传的文件是file6。所以当
http://www.sqlfiddle.com/#!9/0e88c0/1
预期产出
file3的先前文件列表
Id | filename
------------
1 | file1
2 | file2
file6的先前文件列表
Id | filename
------------
4 | file4
5 | file5
答案 0 :(得分:1)
基于您提供的(原始)样本
id fname prev_id
1 file1 (null)
2 file2 1
3 file3 2
4 file4 (null)
您可以使用自我加入,例如:
select a.*
from test_table a
inner join test_table b on b.fname ='file3'
and a.prev_id <= b.prev_id
http://www.sqlfiddle.com/#!9/9ec606/21
a表重新调整file3的prev_id,b表返回满足查询条件的valud
答案 1 :(得分:1)
这将为您提供包括file3
select t1.id, t1.fname, @pv := t1.prev_id prev_id
from (select * from test_table order by id desc) t1
join (select @pv := 3) tmp // 3 is the id of file3
where t1.id = @pv;
参考: https://stackoverflow.com/a/24901882/8317643
<强>更新强>
没有file3
select (@pv := t1.prev_id) id, t1.fname
from (select * from test_table order by id desc) t1
join (
select @pv := (
select t4.prev_id
from test_table t4
where t4.id = 3
)
) tmp
where t1.id = @pv;
答案 2 :(得分:0)
select * from file where id < 14 ;
首先,它会列出id已小于file3
的所有文件,因为它们已经排序了。
做同样事情的其他方法是:(如果上传的文件有许多以前的记录,你可以限制它们)
select * from file where id in (
select id from file where id < 14
) order by id DESC limit 1;