project表(项目基本信息)id      project_name
1       项目1
2       项目2
item表(条目基本信息)id      item_name
1       Item1
2       Item2
project_item表(记录项目中包含的条目,一个项目中包含多个条目。)id      item_id      project_id
1       1            1
2       2            1
3       2            2
project_item_file表
(记录项目条目中包含的文件,其中item_id是project_item表中的id,parent_id是本表的id)
一个项目条目下包含多个文件,可能有文件夹id      item_id      file_name      parent_id      is_folder
1       1            xxx.doc        0              0
2       1            zzz.xls        0              0
3       2            fff.txt        4              0
4       2            文件夹1        0              1
5       3            rrr.txt        0              0
需要用一条sql语句查询出某个项目中包含的所有文件,并且按照条目/文件夹(如果有)/文件名的格式显示。
比如查询项目1(按id查询):
Item1/xxx.doc
Item1/zzz.xls
Item1/文件夹1/fff.txt
mysqlsql数据库查询

解决方案 »

  1.   

    MYSQL不支持递归查询,递归SP来解决
      

  2.   

    create table #project(id int,project_name varchar(100))
    insert into #project
    select 1,'项目1'
    union all select 2,'项目2'create table #item(id int,item_name varchar(100))
    insert into #item
    select 1,'Item1'
    union all select 2,'Item2'create table #project_item(id int,item_id int,project_id int)
    insert into #project_item
    select 1,1,1
    union all select 2,2,1
    union all select 3,2,2create table #project_item_file(id int,item_id int,[file_name] varchar(50),parent_id int,is_folder int)
    insert into #project_item_file
    select 1,1,'xxx.doc',0,0
    union all select 2,1,'zzz.xls',0,0
    union all select 3,2,'fff.txt',4,0
    union all select 4,2,'文件夹',0,1
    union all select 5,3,'rrr.txt',0,0
    go
    select b.project_name,c.file_name
    from #project_item a
    left join #project b on a.project_id=b.id
    inner join #project_item_file c on a.item_id=c.item_id
    order by b.project_namedrop table #project,#item,#project_item,#project_item_file/*
    project_name file_name
    ------------------------------------
    项目1 xxx.doc
    项目1 zzz.xls
    项目1 fff.txt
    项目1 文件夹
    项目2 文件夹
    项目2 fff.txt
    */
      

  3.   

    修改一下:create table #project(id int,project_name varchar(100))
    insert into #project
    select 1,'项目1'
    union all select 2,'项目2'create table #item(id int,item_name varchar(100))
    insert into #item
    select 1,'Item1'
    union all select 2,'Item2'create table #project_item(id int,item_id int,project_id int)
    insert into #project_item
    select 1,1,1
    union all select 2,2,1
    union all select 3,2,2create table #project_item_file(id int,item_id int,[file_name] varchar(50),parent_id int,is_folder int)
    insert into #project_item_file
    select 1,1,'xxx.doc',0,0
    union all select 2,1,'zzz.xls',0,0
    union all select 3,2,'fff.txt',4,0
    union all select 4,2,'文件夹1',0,1
    union all select 5,3,'rrr.txt',0,0
    go
    --select b.item_name,d.file_name,c.file_name,
    select fpath=b.item_name+case when isnull(d.file_name,'')='' then '' else '/'+d.file_name end+'/'+c.file_name
    from #project_item a
    left join #item b on a.item_id=b.id
    left join #project_item_file c on a.item_id=c.item_id
    left join #project_item_file d on c.parent_id=d.id
    where c.is_folder=0
    order by b.item_namedrop table #project,#item,#project_item,#project_item_file/*
    fpath
    ------------------
    Item1/xxx.doc
    Item1/zzz.xls
    Item2/文件夹1/fff.txt
    Item2/文件夹1/fff.txt
    */
      

  4.   

    加distinct create table #project(id int,project_name varchar(100))
    insert into #project
    select 1,'项目1'
    union all select 2,'项目2'create table #item(id int,item_name varchar(100))
    insert into #item
    select 1,'Item1'
    union all select 2,'Item2'create table #project_item(id int,item_id int,project_id int)
    insert into #project_item
    select 1,1,1
    union all select 2,2,1
    union all select 3,2,2create table #project_item_file(id int,item_id int,[file_name] varchar(50),parent_id int,is_folder int)
    insert into #project_item_file
    select 1,1,'xxx.doc',0,0
    union all select 2,1,'zzz.xls',0,0
    union all select 3,2,'fff.txt',4,0
    union all select 4,2,'文件夹1',0,1
    union all select 5,3,'rrr.txt',0,0
    go
    --select b.item_name,d.file_name,c.file_name,
    select distinct fpath=b.item_name+case when isnull(d.file_name,'')='' then '' else '/'+d.file_name end+'/'+c.file_name
    from #project_item a
    left join #item b on a.item_id=b.id
    left join #project_item_file c on a.item_id=c.item_id
    left join #project_item_file d on c.parent_id=d.id
    where c.is_folder=0
    drop table #project,#item,#project_item,#project_item_file/*
    fpath
    ------------------
    Item1/xxx.doc
    Item1/zzz.xls
    Item2/文件夹1/fff.txt
    */
      

  5.   

    不太擅长sql,我自己写了一个,可以正确得到结果,但是用了两个子查询,由于项目框架的原因和一些特殊业务问题,不能使用子查询,故来请教。
      

  6.   

    不太擅长sql,我自己写了一个,可以正确得到结果,但是用了两个子查询,由于项目框架的原因和一些特殊业务问题,不能使用子查询,故来请教。
    相当坑爹,等于从北京去上海不可以走飞机、动车和高速,辛苦!
      

  7.   

    是不是这句话改成这样?
    select fpath=b.item_name+case when isnull(d.file_name,'')='' then '' else '/'+d.file_name end+'/'+c.file_name
    from #project_item a
    left join #item b on a.item_id=b.id
    left join #project_item_file c on a.id=c.item_id
    left join #project_item_file d on c.parent_id=d.id
    where c.is_folder=0
    order by b.item_name