UNION ALL - ORDER BY,排序

Posted

技术标签:

【中文标题】UNION ALL - ORDER BY,排序【英文标题】:UNION ALL - ORDER BY, sorting 【发布时间】:2014-07-17 18:38:39 【问题描述】:

我从 3 个表中获取记录:

(
    SELECT
        f.id AS id,
        'Faktura VAT' as type,
        DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue
    FROM Invoice_vat f
)
UNION ALL
(
    SELECT
        f.id AS id,
        'Faktura korygująca' as type,
        DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue
    FROM Invoice_fks f
)
UNION ALL
(
    SELECT
        f.id AS id,
        'Faktura proforma' as type,
        DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue
    FROM Invoice_pro f
)
ORDER BY date_issue DESC

我尝试使用字段“date_issue”对所有内容进行排序,但这不起作用...有什么想法吗?

【问题讨论】:

【参考方案1】:

它按“date_issue”排序。问题是它的格式很糟糕,一个月中的第一天是第一天。因此,该列表可能从 1 月 1 日开始,但 2 月 1 日在 1 月 2 日之前。我将使用规范格式 YYYY-MM-DD 来解决这个问题,这是日期的 ISO 标准格式。

您也可以通过在输出中包含原始列来轻松解决此问题:

(
    SELECT
        f.id AS id,
        'Faktura VAT' as type,
        DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue,
        f.date_issue as orig_date_issue
    FROM Invoice_vat f
)
UNION ALL
(
    SELECT
        f.id AS id,
        'Faktura korygująca' as type,
        DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue,
        f.date_issue as orig_date_issue
    FROM Invoice_fks f
)
UNION ALL
(
    SELECT
        f.id AS id,
        'Faktura proforma' as type,
        DATE_FORMAT(f.date_issue, '%d.%m.%Y') AS date_issue,
        f.date_issue as orig_date_issue
    FROM Invoice_pro f
)
ORDER BY orig_date_issue DESC;

如果您实际上不想选择该字段,可以使用子查询。

【讨论】:

【参考方案2】:

您是按date_issue 的修改版本排序的,所以它将作为字符串而不是日期排序。

尝试为最后的日期进行格式化,而不是为每个Union

Select  ID, 
        Type, 
        DATE_FORMAT(date_issue, '%d.%m.%Y') As Date_Issue
From
(
    (
        SELECT
            f.id AS id,
            'Faktura VAT' as type,
            f.date_issue
        FROM Invoice_vat f
    )
    UNION ALL
    (
        SELECT
            f.id AS id,
            'Faktura korygująca' as type,
            f.date_issue
        FROM Invoice_fks f
    )
    UNION ALL
    (
        SELECT
            f.id AS id,
            'Faktura proforma' as type,
            f.date_issue
        FROM Invoice_pro f
    )
) A
ORDER BY A.date_issue DESC

【讨论】:

以上是关于UNION ALL - ORDER BY,排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序

UNION ALL和order by 的关系,group by 和字段的关系,以及MAX函数

使用UNION后,ORDER BY 怎样使用

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

为啥在mysql中第一个union两个子句的order by不起作用

提高性能 union all+group by+order by+count