Иерархия на основе трех таблиц - PullRequest
0 голосов
/ 26 апреля 2019

Мне бы хотелось, чтобы строки были похожи на одну таблицу, как показано ниже

id name parentId

Мои текущие таблицы (ключи между ними - внешние ключи)

category
id name

который является родителем всех и

subcategory
id name catId

и последняя таблица, которая является деятельностью

activity
id name subcatId

Для parentId таблицы категорий ничего не будет, поскольку категория является родителем всех

Мои попытки пока не увенчались успехом

Пример данных

category
C-1  HR null
C-2  Development null

subcategory
SC-1 Hiring  C-1
SC-2 Admin C-1
SC-3 Developer C-2

activity
A-1 College Hiring SC-1
A-2 Job Fair SC-1
A-3 Java Development SC-3


Result Needed
1 HR null
2 Development null
3 Hiring C-1
4 Admin C-1
5 Developer C-2
6 College SC-1
7 Job Fair SC-1
8 Java Development SC-3

Надеюсь, это понятнее. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать Спасибо

моя попытка на 2 столах

select name 
from (
    select c.name   
    from category c 
    union all
    select b.name 
    from subcategory b
        inner join category ca
            on ca.id = b.parentId
     )

Я получаю сообщение об ошибке

Каждая производная таблица должна иметь свой псевдоним

Нужно ли добавить следующие строки в мой запрос

start with parent_id is null
connect by prior id = parent_id

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Попробуйте что-то вроде этого:

SELECT @id := @id + 1 AS id, name, parent_id
FROM ( SELECT name, NULL AS parent_id FROM category
       UNION ALL
       SELECT id, name, catId FROM subcategory
       UNION ALL
       SELECT id, name, parentId FROM activity
     ) q,
     ( SELECT @id := 0 ) w;
  • Используется UNION ALL для объединения результатов нескольких запросов.
  • В UNION имена столбцов первого запросаиспользуется в качестве имен столбцов результирующего набора.
  • Используется переменная @id и оператор присваивания := для генерации вычисленных значений столбца ID.
  • Имейте в виду: если выиспользуйте LIMIT или OFFSET, значения столбца id не будут согласованными.
0 голосов
/ 26 апреля 2019

На самом деле, вот как это должно решить вашу проблему:

select name 
from (
    select c.name   
    from category c 
    union all
    select b.name 
    from subcategory b
        inner join category ca
            on ca.id = b.parentId
     ) A -- alias is required for sub-query. 

Вы можете установить в качестве псевдонима что угодно, при условии, что это не будет конфликтовать с некоторым зарезервированным словом MySQL.Вы также можете установить это так: ) AS A.

В вашей ситуации я не думаю, что нужно выполнять подзапрос или внутреннее соединение.Если вы действительно хотите, чтобы результат был таким, вы можете просто использовать union all:

SELECT name,'' as ID from category
UNION ALL
SELECT name,catId FROM subcategory
UNION ALL
SELECT name,subcatId FROM activity;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...