Как использовать UNION с двумя операторами, имеющими ORDER BY - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь получить имена папок и файлов из разных таблиц, в результате КАЖДЫЙ оператор запроса сортирует их по убыванию их update_date, а затем соединяет их, используя UNION.

Если яЗапустите эти два запроса по отдельности. Это сработает, и результат будет получен из базы данных в порядке убывания даты.Но когда я использую UNION с ними, это не дает мне правильного ответа.

Какой может быть правильный способ получить его?

(
    SELECT create_date, folder_name AS actual_name, folder_id, folder_displayed_name AS displayed_name, update_date, delete_flag, NULL AS img_url, NULL AS protect_flag, NULL AS file_type, list_order
    FROM aaaaa_estate.docs_folder
    WHERE delete_flag =0
    AND inside_of_folder =  ''
    ORDER BY update_date DESC

    )
    UNION (

    SELECT create_date, file_name AS actual_name, id, displayed_name, update_date, delete_flag, img_url, protect_flag, file_type, list_order
    FROM aaaaa_estate.docs_contract
    WHERE delete_flag =0
    AND inside_of =  ''
    ORDER BY update_date DESC
)

Если я использую предложение Order Byв самом конце.Он сортирует все данные на основе их update_date ORDER BY DESC, которые я никогда не хочу.

Я хочу показать список документов пользователю, как Google показывает в Google Drive, сначала всегда папка, а затем файлы, а затем.Каждый из них Отсортировано по update_date DESC

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вы можете попробовать следующее, где ORDER BY предложение зависит от двух столбцов:

SELECT * FROM
(
    SELECT 1 qry_nr, create_date, folder_name AS actual_name, folder_id, folder_displayed_name AS displayed_name, update_date, delete_flag, NULL AS img_url, NULL AS protect_flag, NULL AS file_type, list_order
    FROM aaaaa_estate.docs_folder
    WHERE delete_flag =0
    AND inside_of_folder =  ''


    UNION 

    SELECT 2 qry_nr, create_date, file_name AS actual_name, id, displayed_name, update_date, delete_flag, img_url, protect_flag, file_type, list_order
    FROM aaaaa_estate.docs_contract
    WHERE delete_flag =0
    AND inside_of =  ''
 -- ORDER BY update_date DESC
) q
ORDER BY q.actual_name, q.qry_nr;
0 голосов
/ 17 октября 2018

использовать порядок из подзапроса

select t.* from 
(
    SELECT 1 as type, create_date, folder_name AS actual_name, folder_id, folder_displayed_name AS displayed_name, update_date, delete_flag, NULL AS img_url, NULL AS protect_flag, NULL AS file_type, list_order
    FROM aaaaa_estate.docs_folder
    WHERE delete_flag =0
    AND inside_of_folder =  ''   

    UNION     
    SELECT 2 ,create_date, file_name AS actual_name, id, displayed_name, update_date, delete_flag, img_url, protect_flag, file_type, list_order
    FROM aaaaa_estate.docs_contract
    WHERE delete_flag =0
    AND inside_of =  ''

) t order by type asc, update_date desc

Как вы упомянули, что вы всегда папка всегда, а файлы - вторая, поэтому разделите ее на два типа, чтобы обеспечить правильное упорядочение

...