Обратный Mysql Запрос - PullRequest
2 голосов
/ 07 мая 2020

У меня есть две базы данных, которые выглядят следующим образом:

| 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 создать обратный рекурсивный запрос, который возвращает, если родительский элемент является sport. * Например:

В моем случае пользователю с идентификатором 2004 назначается элемент 2, который является спортивным, но также назначается элементу 9. Элемент с идентификатором 9 - это команда, которая привязана к категории с идентификатором 7, в этом случае это не спорт, тогда мне нужно проконсультироваться с его родителем, чтобы проверить, является ли он спортом ...

Что я ожидать

| idElement | | ----------- | | 2 | | 4 |

Пример SQLFiddle

Ответы [ 2 ]

1 голос
/ 07 мая 2020

В 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 .

0 голосов
/ 07 мая 2020

Это мой подход к решению того, что я понял. Чтобы проверить, является ли родитель пользователя спортом или нет:

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; Прокомментируйте, пожалуйста, в случае запроса или дальнейшего обсуждения.

...