首页 新闻 会员 周边

请教一个sql问题,想半天没想出来

0
[已解决问题] 解决于 2018-09-14 19:38

现在假设有这样一张数据表A

id        name       id_source

1        张三        0

2        李四        1

3        王五        2

4         宝宝       0

5        蓉蓉        4

以上数据id_source=0表示发起人也就是第一条数据,它与id对应,比如以上数据张三为发起人,他的id再李四的id_source能找到,说明李四是张三手下,以此类推,且每人最多只有一个手下或者没有手下。

 

现在我要用一条sql,查询一个链条,比如我知道王五的id=3,知道这个条件后,我需要查出他的上级,上级的上级。。。所有的id。

求sql大神解答

问题补充:

用的是mysql

老梁讲Java的主页 老梁讲Java | 初学一级 | 园豆:142
提问于:2017-12-21 11:23
< >
分享
最佳答案
0

WITH locs(id,id_source,name)
AS
(
SELECT id,id_source,name FROM Users WHERE id=5--用户id
UNION ALL
SELECT A.id,A.id_source,A.name FROM Users A,locs B where
b.id_source=a.id
)
select [id],[name],[id_source] from locs

 

奖励园豆:5
四毛的家 | 菜鸟二级 |园豆:249 | 2017-12-21 14:44

请问这是sqlserver还是mysql的?

老梁讲Java | 园豆:142 (初学一级) | 2017-12-21 14:56

@梦幻迷烟: sqlserver

四毛的家 | 园豆:249 (菜鸟二级) | 2017-12-21 14:56

@四毛的家: 我用的mysql,不好意思没说明白

老梁讲Java | 园豆:142 (初学一级) | 2017-12-21 14:58
其他回答(4)
0
大楚打码人 | 园豆:4313 (老鸟四级) | 2017-12-21 11:44

多谢,此方法我已实践,传入单个参数,可以快速得到他的所有父级id,但是我把整个函数作为条件去查询整个符合条件的表数据时,查询非常缓慢。我把单独运行的数据拿出来直接用in是很快的,单独函数也很快,但是合起来就很慢了.

我运行的sql如下,

select * from database.table a
where a.id in (queryChildrenAreaInfo('54160'));

支持(0) 反对(0) 老梁讲Java | 园豆:142 (初学一级) | 2017-12-21 14:42
0

王五的id=3,查出id_source=2,再找id_source<2的不就是他的所有上级麽,最后可以根据id_source正序排一下,那么得到的结果就是王五的所有上级信息,并且有顺序。

顾星河 | 园豆:7173 (大侠五级) | 2017-12-21 11:50

这里的序号并没有大小的区别,是随机生成的,不能用大小区别

支持(0) 反对(0) 老梁讲Java | 园豆:142 (初学一级) | 2017-12-21 12:07

@梦幻迷烟: 好吧,我理解错了 

支持(0) 反对(0) 顾星河 | 园豆:7173 (大侠五级) | 2017-12-21 14:02

@梦幻迷烟:  我模拟了下数据,写了一段SQL,可以用了,你可以参考一下:

mssql写的,mysql可能语法上有点区别,但是思路是可以用,你试试~

CREATE TABLE #info(
    id INT ,
    NAME NVARCHAR(56)
)
DECLARE @CURRID INT ;
DECLARE @NAME NVARCHAR(56) ;
SET @CURRID=3;--王五的ID
WHILE @CURRID>0
BEGIN
SELECT @CURRID=ID_Source,@NAME=Name FROM dbo.T2 WITH(NOLOCK) WHERE ID=@CURRID 
        INSERT INTO #info SELECT @CURRID,@NAME
END
SELECT * FROM #info
DROP TABLE #info
支持(0) 反对(0) 顾星河 | 园豆:7173 (大侠五级) | 2017-12-21 14:40
0

 //存储过程 递归

CREATE proc [dbo].[proc_Team]('传入老王的ID' int)
as
   WITH    Emp
 AS ( SELECT  * FROM  dbo.A
               WHERE  id='传入老王的ID'
                UNION ALL  
                SELECT d.* FROM  Emp
                         INNER JOIN dbo.A d ON d.id_source = Emp.id
             )
    SELECT *
     FROM Emp where id!='传入老王的ID'



GO

 

//SQL 语句这样写 亲测有效

 WITH    Emp AS ( SELECT  * FROM A
               WHERE  id='老王的ID'
                UNION ALL  
                SELECT * FROM  Emp
                         INNER JOIN A AS d ON d.id_source = Emp.id
             )
    SELECT * FROM Emp where id!='老王的ID'

紅人 | 园豆:117 (初学一级) | 2017-12-21 14:19

sqlserver的吗?我需要mysql的

支持(0) 反对(0) 老梁讲Java | 园豆:142 (初学一级) | 2017-12-21 15:28
0

自链接就行了

~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2017-12-22 17:03

当有多串这样的数据,只知道一串数据结尾参数的一个字段条件,查出整串数据,自连接不够用。你能写出这样的sqll,查出一串数据?

支持(0) 反对(0) 老梁讲Java | 园豆:142 (初学一级) | 2017-12-22 17:43

@梦幻迷烟: 就是说你查的字段是动态的 有几个上级 显示几列?

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2017-12-22 17:46

@梦幻迷烟: 也可以在程序中实现呀 

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2017-12-22 17:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册