反向 Mysql 查询
Reverse Mysql Query
我有两个数据库,如下所示:
| idElement | idClient | idSubClient | idSport | idCategory | idTeam | idParent |
|-----------|----------|-------------|---------|------------|--------|----------|
| 1 | 1 | -1 | (null) | (null) | (null) | (null) |
| 2 | 1 | -1 | 30 | (null) | (null) | 1 |
| 3 | 1 | -1 | (null) | 100 | (null) | 2 |
| 4 | 1 | -1 | 31 | (null) | (null) | 1 |
| 5 | 1 | -1 | (null) | (null) | 150 | 3 |
| 6 | 1 | -1 | (null) | (null) | 151 | 3 |
| 7 | 1 | -1 | (null) | 101 | (null) | 4 |
| 8 | 1 | -1 | (null) | 101 | (null) | 2 |
| 9 | 1 | -1 | (null) | (null) | 152 | 7 |
| 10 | 1 | -1 | (null) | (null) | 153 | 7 |
| idRef | idElement | idUser |
|-------|-----------|--------|
| 1 | 1 | 2000 |
| 2 | 1 | 2001 |
| 3 | 1 | 2002 |
| 4 | 1 | 2003 |
| 5 | 2 | 2004 |
| 6 | 2 | 2005 |
| 7 | 3 | 2001 |
| 8 | 4 | 2003 |
| 9 | 9 | 2004 |
我想用 idUser、idClient、idSubclient 创建反向递归查询 returns 如果元素的 parent 是运动。
例如:
在我的例子中,id 为 2004
的用户被分配给 2
元素,该元素是运动,但也被分配给元素 9
。 id 为 9
的元素是一个挂在 id 为 7
类别的团队,在这种情况下它不是一项运动,那么我需要咨询他的 parent 以检查是否是运动...
我期待的
|元素 |
|------------|
| 2 |
| 4 |
这是我解决我所理解的方法。检查用户的 parent 是否运动:
select if(o.idSport>0,'TRUE','FALSE') as isSport,o.idElement, o.idParent,u.idUser from organigram o join organigram_users u on (u.idElement = o.idElement) where u.idUser = 2004;
如有疑问或进一步讨论,请发表评论。
在 MariaDB 10.4 中,您可以使用递归 CTE 来查找所需的行。例如:
with recursive
u as (
select
u.idUser, u.idElement as root,
o.idElement, o.idParent, o.idSport, 1 as lvl from organigram_users u
join organigram o on o.idElement = u.idElement
where u.idUser = 2004
UNION ALL
select u.idUser, u.root, o.idElement, o.idParent, o.idSport, u.lvl + 1
from u
join organigram o on o.idElement = u.idParent and u.idSport is null
),
s as (
select *
from (
select *,
row_number() over(partition by idUser, root order by lvl desc) as rn
from u
) x
where rn = 1
)
select * from s; -- idElement shows 2, 4
结果:
idUser root idElement idParent idSport lvl rn
------ ---- --------- -------- ------- --- --
2004 2 2 1 30 1 1
2004 9 4 1 31 3 1
列idElement
显示具有非空idSport
值的最大父级:一个在第一级,另一个在第三级。
请参见 db<>fiddle 中的 运行 示例。
我有两个数据库,如下所示:
| idElement | idClient | idSubClient | idSport | idCategory | idTeam | idParent |
|-----------|----------|-------------|---------|------------|--------|----------|
| 1 | 1 | -1 | (null) | (null) | (null) | (null) |
| 2 | 1 | -1 | 30 | (null) | (null) | 1 |
| 3 | 1 | -1 | (null) | 100 | (null) | 2 |
| 4 | 1 | -1 | 31 | (null) | (null) | 1 |
| 5 | 1 | -1 | (null) | (null) | 150 | 3 |
| 6 | 1 | -1 | (null) | (null) | 151 | 3 |
| 7 | 1 | -1 | (null) | 101 | (null) | 4 |
| 8 | 1 | -1 | (null) | 101 | (null) | 2 |
| 9 | 1 | -1 | (null) | (null) | 152 | 7 |
| 10 | 1 | -1 | (null) | (null) | 153 | 7 |
| idRef | idElement | idUser |
|-------|-----------|--------|
| 1 | 1 | 2000 |
| 2 | 1 | 2001 |
| 3 | 1 | 2002 |
| 4 | 1 | 2003 |
| 5 | 2 | 2004 |
| 6 | 2 | 2005 |
| 7 | 3 | 2001 |
| 8 | 4 | 2003 |
| 9 | 9 | 2004 |
我想用 idUser、idClient、idSubclient 创建反向递归查询 returns 如果元素的 parent 是运动。
例如:
在我的例子中,id 为 2004
的用户被分配给 2
元素,该元素是运动,但也被分配给元素 9
。 id 为 9
的元素是一个挂在 id 为 7
类别的团队,在这种情况下它不是一项运动,那么我需要咨询他的 parent 以检查是否是运动...
我期待的
|元素 | |------------| | 2 | | 4 |
这是我解决我所理解的方法。检查用户的 parent 是否运动:
select if(o.idSport>0,'TRUE','FALSE') as isSport,o.idElement, o.idParent,u.idUser from organigram o join organigram_users u on (u.idElement = o.idElement) where u.idUser = 2004;
如有疑问或进一步讨论,请发表评论。
在 MariaDB 10.4 中,您可以使用递归 CTE 来查找所需的行。例如:
with recursive
u as (
select
u.idUser, u.idElement as root,
o.idElement, o.idParent, o.idSport, 1 as lvl from organigram_users u
join organigram o on o.idElement = u.idElement
where u.idUser = 2004
UNION ALL
select u.idUser, u.root, o.idElement, o.idParent, o.idSport, u.lvl + 1
from u
join organigram o on o.idElement = u.idParent and u.idSport is null
),
s as (
select *
from (
select *,
row_number() over(partition by idUser, root order by lvl desc) as rn
from u
) x
where rn = 1
)
select * from s; -- idElement shows 2, 4
结果:
idUser root idElement idParent idSport lvl rn
------ ---- --------- -------- ------- --- --
2004 2 2 1 30 1 1
2004 9 4 1 31 3 1
列idElement
显示具有非空idSport
值的最大父级:一个在第一级,另一个在第三级。
请参见 db<>fiddle 中的 运行 示例。