2

我有两个看起来像这样的数据库:

| 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 创建反向递归查询,如果元素的父级是运动则返回。

例如:

在我的情况下,具有 id 的 User2004被分配给2元素是 sport,但也被分配给 element 9。带有 id 的元素9是一个挂在带有 id 的类别上的团队,7在这种情况下它不是一项运动,那么我需要咨询他的父母以检查是否是运动......

我的期望

| id元素 | |-----------| | 2 | | 4 |

SQLFiddle 示例

4

2 回答 2

1

在 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的运行示例。

于 2020-05-07T15:23:51.817 回答
0

这是我解决我所理解的问题的方法。要检查用户的父母是否运动:

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; 如有疑问或进一步讨论,请发表评论。

于 2020-05-07T13:09:48.940 回答