首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向Mysql查询

反向Mysql查询
EN

Stack Overflow用户
提问于 2020-05-07 12:43:33
回答 2查看 145关注 0票数 2

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

代码语言:javascript
复制
| 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 |
代码语言:javascript
复制
| 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 2004的用户被分配给2元素,即运动元素,但也被分配给元素9。id 9的元素是一个与id 7挂在类别上的团队,在这种情况下它不是一项运动,所以我需要咨询他的父母来检查是否是体育.

我所期望的

( idElement )\x{e76f}\x{e76f}\x

SQLFiddle实例

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-07 15:23:51

在MariaDB 10.4中,可以使用递归CTE查找所需的行。例如:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
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上运行示例。

票数 1
EN

Stack Overflow用户

发布于 2020-05-07 13:09:48

这是我解决我所理解的问题的方法。若要检查用户的父级是否具有运动性质,请执行以下操作:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61658150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档