MySQL — ВНУТРЕННЕЕ СОЕДИНЕНИЕ — Глобальный ПОРЯДОК ПО

#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
 

Я бы использовал одни и те же имена столбцов (при необходимости используя псевдонимы) в каждом ВЫБОРЕ ОБЪЕДИНЕНИЯ, чтобы вы/другие могли прочитать, к какому целевому столбцу вы пытаетесь «сопоставить» исходный столбец.

Изменить: псевдонимы не отображаются автоматически. Порядок столбцов в каждом элементе ОБЪЕДИНЕНИЯ по-прежнему имеет значение. Но использование одного и того же имени столбца повышает читабельность.