求大神帮忙写一条sql语句

首先我有3张表,一张user用户表,一张dept部门表,一张userdept映射表,还有一张company公司表。
user(用户表):
1 张三
2 李四
3 王五
4 小明
5 小红

company(公司表)
1 ××科技有限公司
2 中国电信公司

dept(部门表,第一个为id,第二个为名称,第三个是父部门,第四个为公司id,第五个是部门递归映射)
1 客服部 0 1 0
2 销售部 0 1 0
3 销售1部 2 1 0-2

userdept(映射表,第一个为用户id,第二个为部门id):
1 1
2 1
2 2
3 2
3 3
4 3
5 3

简介:一个公司有多个部门,一个部门会有多个用户,一个用户也能有多个部门,而且部门还存在子部门,子部门也可以继续有子部门

现在我要查询的是,已知公司id,如何写sql语句实现如下树状图效果(数据库是mysql,后台是用的java语言):

+----客服部
-----------张三
-----------李四
+----销售部
-----------李四
-----------王五
+---------销售1部(子部门)
----------------------王五
----------------------小明
----------------------小红

求大神帮解决,希望能有一个执行效率比较高的方法,
关于部门表里的映射字段是我看别人写的,查询无限级递归非常效率的方法。
如果大神有好方法,完全可以无视这个字段。
急求解决方案,谢谢,分全加上去了。

第1个回答  2014-07-26
最好建议表架构不是树状架构,树状架构要求你写函数或者存储结构查询出子节点或者父节点,在数据多是,用函数或者存储结构并不是最高效的,可以把表结构改成:
id
1 公司A
2 客服部
3 销售部
4 销售1部

父节点 子节点
1 2
1 3
1 4
3 4

这样看起来表数据很多,但是表只有2个字段,使用非常方便,也非常快,父节点和子节点

你要查子节点和父节点的存储过程也有,如:

父节点查询子节点
create function GetChildID(@ParentID int)
returns @t table(ID int)
as
begin
insert into @t select id from [DJB].[dbo].[rsbm] where parent_id = @ParentID
while @@rowcount<>0
begin
insert into @t select a.id from [DJB].[dbo].[rsbm] as a
inner join @t as b
on a.parent_id = b.ID
and not exists(select 1 from @t where ID=a.ID)
end
return
end
go
select * from dbo.GetChildID(1661)

子节点查询父节点
create function GetParentID(@ChildID int)
returns @t table(PID int)
as
begin
insert into @t select parent_id from [DJB].[dbo].[rsbm] where ID=@ChildID
while @@rowcount<>0
begin
insert into @t select a.parent_id from [DJB].[dbo].[rsbm] as a
inner join @t as b
on a.ID=b.PID
and not exists(select 1 from @t where PID=a.parent_id)
end
return
end
go
select * from dbo.GetParentID(1648)追问

大哥。能仔细看下需求么

相似回答