Иерархия на основе трех таблиц

0

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

id name parentId

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

category
id name

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

subcategory
id name catId

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

activity
id name subcatId

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

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

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

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
  • 0
    примерные данные и ожидаемый результат помогут.
  • 1
    Добавьте псевдоним после закрывающей скобки .. как это -> ) A .. Затем попробуйте выполнить снова
Показать ещё 1 комментарий
Теги:
database

2 ответа

1

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

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
    Привет Усаги, могу ли я знать, что этот запрос для какой версии MySQL? Поскольку мое тестирование на MySQL 5.5, @id вернул NULL .
  • 1
    Ой, мой плохой, использовал = вместо := .... Исправлено.
Показать ещё 2 комментария
0

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

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;
  • 0
    Проблема в том, что мне нужен как родительский идентификатор, так и сгенерированный идентификатор (см. Ожидаемый результат). Спасибо !
  • 0
    Да, я заметил, что @EshanI. .. Извините, я обновил свой ответ, пожалуйста, проверьте спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню