【问题标题】:How to use UNION with two statements having ORDER BY如何将 UNION 与两个具有 ORDER BY 的语句一起使用
【发布时间】:2018-10-17 12:24:20
【问题描述】:

我正在尝试从不同的表中获取文件夹和文件名,以及每个查询语句的结果,按其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 Drive 中的 Google 显示,Always Folder first and files second 。他们每个人都按update_date DESC排序

【问题讨论】:

    标签: mysql sql sql-order-by union


    【解决方案1】:

    您可以尝试以下 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;
    

    【讨论】:

    • @Cheeko 好的,我已经编辑过了,关于图片似乎应该删除内部的ORDER BY 子句。
    • 什么是 qry_nr ?
    • 请在i.snag.gy/oPq0mR.jpg查看您的查询结果。它仍然无法正常工作
    • @Cheeko 我想你想要这个ORDER BY q.actual_name, q.qry_nr
    【解决方案2】:

    在子查询之外使用 order by

    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
    

    正如您提到的,您始终首先使用文件夹,然后将文件划分为两种类型以保持正确的顺序

    【讨论】:

    • 我爱你 :) 你救了我的命 :D
    • @Cheeko 感谢乐于提供帮助,如果有帮助,请接受它作为答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多