#mysql #sql
Вопрос:
Приведенный ниже запрос создает иерархическую связь с таблицами и записями:
program -> program_outcome_group -> program_outcome -> unit -> leaning_event
На основе следующих структур таблиц:
Table program:
------------ ----------------
| program_pk | program_name |
------------ ----------------
Table program_outcome_group:
-------------------------- ------------------------ ------------
| program_outcome_group_pk | program_outcome_group | program_fk |
-------------------------- ------------------------ ------------
Table program_outcome:
-------------------- ----------------- --------------------------
| program_outcome_pk | program_outcome | program_outcome_group_fk |
-------------------- ----------------- --------------------------
Table unit:
--------- -----------
| unit_pk | unit_name |
--------- -----------
Table program_outcome_unit_lookup:
-------------------------------- --------------------- ---------
| program_outcome_unit_lookup_pk | program_outcome_fk | unit_fk |
-------------------------------- --------------------- ---------
Table learning_event:
------------------- --------------------- ---------
| learning_event_pk | learning_event_name | unit_fk |
------------------- --------------------- ---------
Table learning_event_program_outcome_lookup:
------------------------------------------ ------------------- --------------------
| learning_event_program_outcome_lookup_pk | learning_event_fk | program_outcome_fk |
------------------------------------------ ------------------- --------------------
Приведенный ниже запрос подходит для этого.
Теперь я хочу добавить таблицу assessment
, которая была бы родным братом к таблице learning_event
:
program -> program_outcome_group -> program_outcome -> unit -> leaning_event
-> assessment
Наряду с assessment
таблицей существует еще одна таблица поиска:
Table assessment:
--------------- ------------ ---------
| assessment_pk | assessment | unit_fk |
--------------- ------------ ---------
Table assessment_program_outcome_lookup:
-------------------------------------- --------------- --------------------
| assessment_program_outcome_lookup_pk | assessment_fk | program_outcome_fk |
-------------------------------------- --------------- --------------------
Как следует изменить приведенный ниже запрос, чтобы добавить новую таблицу братьев и сестер и таблицу поиска?
SELECT CONCAT('program:', p.program_pk) AS global_id,
p.program_name AS name,
NULL AS parent_global_id
FROM program p
UNION ALL
SELECT CONCAT('program_outcome_group:', pog.program_outcome_group_pk) AS global_id,
pog.program_outcome_group AS name,
CONCAT('program:', pog.program_fk) AS parent_global_id
FROM program_outcome_group pog
UNION ALL
SELECT
CONCAT('program_outcome_group:', po.program_outcome_group_fk, ',program_outcome:', po.program_outcome) AS global_id,
po.program_outcome AS name,
CONCAT('program_outcome_group:', po.program_outcome_group_fk) AS parent_global_id
FROM program_outcome po
UNION ALL
SELECT
CONCAT('program_outcome_group:', pro.program_outcome_group_fk, ',program_outcome:', pro.program_outcome, ',unit:', u.unit_full_name) AS global_id,
u.unit_full_name AS name,
CONCAT('program_outcome_group:', pro.program_outcome_group_fk, ',program_outcome:', pro.program_outcome) AS parent_global_id
FROM unit u
INNER JOIN program_outcome_unit_lookup uup ON u.unit_pk = uup.unit_fk
INNER JOIN program_outcome pro ON pro.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog2 ON pro.program_outcome_group_fk = pog2.program_outcome_group_pk
UNION ALL
SELECT
CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_full_name, ',learning_event:', le.learning_event_name) AS global_id,
le.learning_event_name AS name,
CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_full_name) AS parent_global_id
FROM learning_event le
INNER JOIN unit u2 ON le.unit_fk = u2.unit_pk
INNER JOIN program_outcome_unit_lookup uup ON u2.unit_pk = uup.unit_fk
INNER JOIN program_outcome pro2 ON pro2.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog2 ON pro2.program_outcome_group_fk = pog2.program_outcome_group_pk
JOIN learning_event_program_outcome_lookup lepol
ON lepol.learning_event_fk = le.learning_event_pk
AND lepol.program_outcome_fk = pro2.program_outcome_pk
См. скрипка
Комментарии:
1. Каковы роли этих новых таблиц? Будет ли он использоваться для фильтрации определенного набора результатов или он просто вернет дополнительную информацию для конечного результата?
2. Просто заметил, что в вопросе у меня был старый запрос. Теперь обновил это. Две новые таблицы по сути будут такими же функциональными, как две таблицы для событий обучения (таблица learning_event и связанная с ней таблица поиска, learning_event_программ_outcome_lookup). Новые таблицы оценки будут предоставлять братьям и сестрам learning_event и оценку. Таким образом, последний ВЫБОР может быть реплицирован, и learning_event будет заменен оценкой, а затем таблица поиска для оценки будет добавлена таким же образом, как и другая таблица поиска. Надеюсь, в этом есть смысл…
3. Кроме того, оценка таблицы аналогична по функциональности событию изучения таблицы, они были бы братьями и сестрами. Таблицы поиска для каждой из этих таблиц предназначены для фильтрации результатов из двух родственных таблиц на основе связей с program_outcome_fk в таблицах поиска.
Ответ №1:
Вам даже не нужно понимать предыдущий sql,просто измените имя в порядке
union all
SELECT
CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_name, ',assessment:', t1.assessment) AS global_id,
t1.assessment AS name,
CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_name) AS parent_global_id
FROM assessment t1
INNER JOIN unit u2 ON t1.unit_fk = u2.unit_pk
INNER JOIN program_outcome_unit_lookup uup ON u2.unit_pk = uup.unit_fk
INNER JOIN program_outcome pro2 ON pro2.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog2 ON pro2.program_outcome_group_fk = pog2.program_outcome_group_pk
JOIN assessment_program_outcome_lookup t5
ON t5.assessment_fk = t1.assessment_pk
AND t5.program_outcome_fk = pro2.program_outcome_pk