#mysql #sql
Вопрос:
Как я могу реализовать предложение ORDER BY в конце следующего запроса для глобального упорядочения? Это не означает использование ORDER BY в отдельных инструкциях SELECT…
Например, я бы хотел ORDER BY le.learning_event_name
.
Я попытался добавить le.learning_event_name AS le_name,
затем в конце запроса ORDER BY le_name ASC
, но получил неизвестный столбец «имя файла» в предложении order.
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_group:', pg.program_group_pk) AS global_id,
pg.program_group,
CONCAT('program:', pg.program_fk) AS parent_global_id
FROM program_group pg
UNION ALL
SELECT CONCAT('program_group:', pog.program_group_fk, 'program_outcome_group:', pog.program_outcome_group) AS global_id,
pog.program_outcome_group,
CONCAT('program_group:', pog.program_group_fk) AS parent_global_id
FROM program_outcome_group pog
UNION ALL
SELECT
CONCAT('program_group:', pog2.program_group_fk, 'program_outcome_group:', pog2.program_outcome_group, ',program_outcome:', po.program_outcome) AS global_id,
po.program_outcome,
CONCAT('program_group:', pog2.program_group_fk, 'program_outcome_group:', pog2.program_outcome_group) AS parent_global_id
FROM program_outcome po
INNER JOIN program_outcome_group pog2 ON po.program_outcome_group_fk = pog2.program_outcome_group_pk
UNION ALL
SELECT
CONCAT('program_group:', pog3.program_group_fk, 'program_outcome_group:', pog3.program_outcome_group, ',program_outcome:', po2.program_outcome, ',unit:', u.unit_full_name) AS global_id,
u.unit_full_name,
CONCAT('program_group:', pog3.program_group_fk, 'program_outcome_group:', pog3.program_outcome_group, ',program_outcome:', po2.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 po2 ON po2.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog3 ON po2.program_outcome_group_fk = pog3.program_outcome_group_pk
UNION ALL
SELECT
CONCAT('program_group:', pog3.program_group_fk, 'program_outcome_group:', pog3.program_outcome_group, ',program_outcome:', po2.program_outcome, ',unit:', u2.unit_full_name, ',unit_group:', ug.unit_group) AS global_id,
ug.unit_group,
CONCAT('program_group:', pog3.program_group_fk, 'program_outcome_group:', pog3.program_outcome_group, ',program_outcome:', po2.program_outcome, ',unit:', u2.unit_full_name) AS parent_global_id
FROM unit_group ug
INNER JOIN unit u2 ON u2.unit_pk = ug.unit_fk
INNER JOIN program_outcome_unit_lookup uup ON u2.unit_pk = uup.unit_fk
INNER JOIN program_outcome po2 ON po2.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog3 ON po2.program_outcome_group_fk = pog3.program_outcome_group_pk
UNION ALL
SELECT
CONCAT('program_group:', pog4.program_group_fk, 'program_outcome_group:', pog4.program_outcome_group, ',program_outcome:', po3.program_outcome, ',unit:', u3.unit_full_name, ',unit_group:', ug2.unit_group, ',learning_event:', le.learning_event_name) AS global_id,
le.learning_event_name,
CONCAT('program_group:', pog4.program_group_fk, 'program_outcome_group:', pog4.program_outcome_group, ',program_outcome:', po3.program_outcome, ',unit:', u3.unit_full_name, ',unit_group:', ug2.unit_group) AS parent_global_id
FROM learning_event le
INNER JOIN unit_group ug2 ON ug2.unit_group_pk = le.unit_group_fk
INNER JOIN unit u3 ON ug2.unit_fk = u3.unit_pk
INNER JOIN program_outcome_unit_lookup uup ON u3.unit_pk = uup.unit_fk
INNER JOIN program_outcome po3 ON po3.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog4 ON po3.program_outcome_group_fk = pog4.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 = po3.program_outcome_pk
UNION ALL
SELECT
CONCAT('program_group:', pog4.program_group_fk, 'program_outcome_group:', pog4.program_outcome_group, ',program_outcome:', po3.program_outcome, ',unit:', u3.unit_full_name, ',unit_group:', ug2.unit_group, ',assessment:', t1.assessment) AS global_id,
t1.assessment,
CONCAT('program_group:', pog4.program_group_fk, 'program_outcome_group:', pog4.program_outcome_group, ',program_outcome:', po3.program_outcome, ',unit:', u3.unit_full_name, ',unit_group:', ug2.unit_group) AS parent_global_id
FROM assessment t1
INNER JOIN unit_group ug2 ON ug2.unit_group_pk = t1.unit_group_fk
INNER JOIN unit u3 ON ug2.unit_fk = u3.unit_pk
INNER JOIN program_outcome_unit_lookup uup ON u3.unit_pk = uup.unit_fk
INNER JOIN program_outcome po3 ON po3.program_outcome_pk = uup.program_outcome_fk
INNER JOIN program_outcome_group pog4 ON po3.program_outcome_group_fk = pog4.program_outcome_group_pk
JOIN assessment_program_outcome_lookup t5
ON t5.assessment_fk = t1.assessment_pk
AND t5.program_outcome_fk = po3.program_outcome_pk
См. скрипку
Комментарии:
1. Ваш вопрос может быть сформулирован неправильно, так как, когда вы обращаетесь
ORDER BY
к внешней части запроса объединения, вы можете сортировать только по объединенным строкам. На данный момент столбцов каждой отдельной таблицы на самом деле нет.2. Не уверен, что я понимаю, но запрос в операции и скрипке работает, но вместо того, чтобы выбирать, какие столбцы упорядочены в конце запроса, он работает со ВСЕМИ столбцами с именем псевдонима. Я просто хочу, чтобы порядок работал с выборочными столбцами, а порядок по имени не индексировался.
3.Знаете ли вы, что в вашем запросе объединения все псевдонимы будут игнорироваться, за исключением тех, которые указаны в самом первом запросе, перед первым
UNION
? Сделайте это: удалите все псевдонимы, кроме самых первых, а затем повторите свой вопрос здесь.4. Вы правы, мне не нужны были более поздние псевдонимы «имя», вопрос и обновление скрипки…
5.
learning_event_name
В вашем конечном наборе результатов нет столбца. Существует столбецname
, и некоторые строки в этом столбце содержат значенияlearning_event_name
, полученные из 1 из объединенных запросов.
Ответ №1:
Я бы добавил один или несколько столбцов в объединение, чтобы сохранить значения для упорядочения. Вот так:
SELECT CONCAT('program:', p.program_pk) AS global_id,
p.program_name AS name,
NULL AS parent_global_id,
-- add the column(s) to sort on ; first SELECT is the template with as result that all other SELECTs should also have (in this case) 4 columns
NULL AS column_to_sort_by
FROM program p
UNION ALL
SELECT CONCAT('program_outcome_group:', pog.program_outcome_group_pk) AS global_id,
pog.program_outcome_group,
CONCAT('program:', pog.program_fk) AS parent_global_id,
-- add the column to sort on ; I use same alias for recognisability
NULL AS column_to_sort_by
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,
CONCAT('program_outcome_group:', po.program_outcome_group_fk) AS parent_global_id,
-- add the column to sort on ; I use same alias for recognisability
NULL AS column_to_sort_by
FROM program_outcome po
UNION ALL
SELECT
CONCAT('program_outcome_group:', pro.program_outcome_group_fk, ',program_outcome:', pro.program_outcome, ',unit:', u.unit_name) AS global_id,
u.unit_name,
CONCAT('program_outcome_group:', pro.program_outcome_group_fk, ',program_outcome:', pro.program_outcome) AS parent_global_id,
-- add the column to sort on ; I use same alias for recognisability
NULL AS column_to_sort_by
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_name, ',learning_event:', le.learning_event_name) AS global_id,
le.learning_event_name,
CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_name) AS parent_global_id,
-- add the column to sort on, which in this case is based on table-column ; I use same alias for recognisability
le.learning_event_name AS column_to_sort_by
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
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,
CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_name) AS parent_global_id,
-- add the column to sort on ; I use same alias for recognisability
NULL AS column_to_sort_by
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
ORDER BY
column_to_sort_by ASC
Я бы использовал одни и те же имена столбцов (при необходимости используя псевдонимы) в каждом ВЫБОРЕ ОБЪЕДИНЕНИЯ, чтобы вы/другие могли прочитать, к какому целевому столбцу вы пытаетесь «сопоставить» исходный столбец.
Изменить: псевдонимы не отображаются автоматически. Порядок столбцов в каждом элементе ОБЪЕДИНЕНИЯ по-прежнему имеет значение. Но использование одного и того же имени столбца повышает читабельность.