用SQL查询查找所选文件的祖先

时间:2018-04-16 09:46:50

标签: mysql

我有一个包含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    

3 个答案:

答案 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;