【问题标题】:MySQL Order By in UNION statementUNION 语句中的 MySQL Order By
【发布时间】:2018-12-08 12:05:33
【问题描述】:

我有这个 MySQL 查询,查询没有给出任何错误。

$sql_i = "(SELECT
            fld.product_id AS product_id,
            inh_pr.naam AS productnaam,
            fld.aantal AS aantal,
            '' AS afmeting,
            '' AS proces,
            '' AS gewicht,
            '' AS kwaliteit,
            '' AS oppervlak,
            '' AS attest,
            '' AS afschuin_id,
            inh_pr.opmerking AS opmerking
            FROM 3_product_folder AS fld
            LEFT JOIN 0_calculatie_inh_id_geg_product AS inh_pr
            ON inh_pr.calculatie_inh_id = fld.product_id
            LEFT JOIN 0_calculatie_inh_id AS id
            ON id.id = inh_pr.calculatie_inh_id
            LEFT JOIN 0_calculatie_id AS calc
            ON calc.id = id.calculatie_id
            WHERE fld.folder_id = '".$row_b['folder_id']."' AND id.soort = 'product'
            ORDER BY inh_pr.naam ASC)

            UNION ALL
        (SELECT
        fld.product_id AS product_id,
        IF(id_plt.naam_in_pos = 'ja', CONCAT(srt.omschrijving,' ',calc.naam, ' ',inh_plt.pos), CONCAT(srt.omschrijving,' ',inh_plt.pos)) AS productnaam,
        fld.aantal AS aantal,
        CONCAT(inh_plt.lengte,'x',inh_plt.breedte,'x',inh_plt.dikte) AS afmeting,
        inh_plt.proces AS proces,
        fld.aantal * inh_plt.gewicht_stk AS gewicht,
        kwal.kwaliteit AS kwaliteit,
        opp.omschrijving AS oppervlak,
        IF(inh_plt.attest > 0, inh_plt.attest, id_plt.attest_std) AS attest,
        inh_plt.afschuin_id AS afschuin_id,
        inh_plt.opmerking AS opmerking
        FROM 3_product_folder AS fld
        LEFT JOIN 0_calculatie_inh_id AS id
        ON id.id = fld.product_id
        LEFT JOIN 0_calculatie_id AS calc
        ON calc.id = id.calculatie_id
        LEFT JOIN 0_calculatie_id_geg_plaat AS id_plt
        ON id_plt.calculatie_id_id = id.calculatie_id
        LEFT JOIN 0_calculatie_inh_id_geg_plaat AS inh_plt
        ON inh_plt.calculatie_inh_id = id.id
        LEFT JOIN calculatie_omtrek AS srt
        ON srt.id = inh_plt.soort_id
        LEFT JOIN kwaliteit AS kwal
        ON kwal.id = IF(inh_plt.kwaliteit_id > 0, inh_plt.kwaliteit_id, id_plt.kwaliteit_id_std)
        LEFT JOIN kwaliteit_opp AS opp
        ON opp.id = IF(inh_plt.oppervlak_id > 0, inh_plt.oppervlak_id, id_plt.oppervl_id_std)
        WHERE fld.folder_id = '".$row_b['folder_id']."' AND id.soort = 'plaat'
        ORDER BY inh_plt.dikte ASC)
    ";

但是查询没有排序inh_plt.dikte ASC

当搜索这个网站和谷歌时似乎无法订购子查询? 但是in this Stackoverflow page 是一个解决方案。

那我是不是误会了什么?请指教。

按照 Steve T 的建议进行查询,结果是 2010 年 6 月 5 日

$sql_i = "SELECT * FROM
            (SELECT
                fld.product_id AS product_id,
                inh_pr.naam AS productnaam,
                fld.aantal AS aantal,
                '' AS dikte,
                '' AS afmeting,
                '' AS proces,
                '' AS gewicht,
                '' AS kwaliteit,
                '' AS oppervlak,
                '' AS attest,
                '' AS afschuin_id,
                inh_pr.opmerking AS opmerking
                FROM 3_product_folder AS fld
                LEFT JOIN 0_calculatie_inh_id_geg_product AS inh_pr
                ON inh_pr.calculatie_inh_id = fld.product_id
                LEFT JOIN 0_calculatie_inh_id AS id
                ON id.id = inh_pr.calculatie_inh_id
                LEFT JOIN 0_calculatie_id AS calc
                ON calc.id = id.calculatie_id
                WHERE fld.folder_id = '".$row_b['folder_id']."' AND id.soort = 'product'

        UNION ALL

            SELECT
                fld.product_id AS product_id,
                IF(id_plt.naam_in_pos = 'ja', CONCAT(srt.omschrijving,' ',calc.naam, ' ',inh_plt.pos), CONCAT(srt.omschrijving,' ',inh_plt.pos)) AS productnaam,
                fld.aantal AS aantal,
                inh_plt.dikte AS dikte,
            CONCAT(inh_plt.lengte,'x',inh_plt.breedte,'x',inh_plt.dikte) AS afmeting,
            inh_plt.proces AS proces,
            fld.aantal * inh_plt.gewicht_stk AS gewicht,
            kwal.kwaliteit AS kwaliteit,
            opp.omschrijving AS oppervlak,
            IF(inh_plt.attest > 0, inh_plt.attest, id_plt.attest_std) AS attest,
            inh_plt.afschuin_id AS afschuin_id,
            inh_plt.opmerking AS opmerking
            FROM 3_product_folder AS fld
            LEFT JOIN 0_calculatie_inh_id AS id
            ON id.id = fld.product_id
            LEFT JOIN 0_calculatie_id AS calc
            ON calc.id = id.calculatie_id
            LEFT JOIN 0_calculatie_id_geg_plaat AS id_plt
            ON id_plt.calculatie_id_id = id.calculatie_id
            LEFT JOIN 0_calculatie_inh_id_geg_plaat AS inh_plt
            ON inh_plt.calculatie_inh_id = id.id
            LEFT JOIN calculatie_omtrek AS srt
            ON srt.id = inh_plt.soort_id
            LEFT JOIN kwaliteit AS kwal
            ON kwal.id = IF(inh_plt.kwaliteit_id > 0, inh_plt.kwaliteit_id, id_plt.kwaliteit_id_std)
            LEFT JOIN kwaliteit_opp AS opp
            ON opp.id = IF(inh_plt.oppervlak_id > 0, inh_plt.oppervlak_id, id_plt.oppervl_id_std)
            WHERE fld.folder_id = '".$row_b['folder_id']."' AND id.soort = 'plaat'
    ) a
    ORDER BY a.dikte DESC";

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这两个查询都对它们的结果进行了排序,但是当您合并它们时,它们不会按照您预期的顺序显示。您可以添加一个包含两个现有查询的环绕选择查询,然后按您需要的字段排序。

    编辑:

    类似:

    SELECT * FROM (
        SELECT CustomerID as ID, CustomerName as Name FROM Customers
    UNION ALL
        SELECT EmployeeID as ID, LastName as Name FROM Employees
    ) a
    ORDER BY a.ID;
    

    【讨论】:

    • 谢谢您,我已经尝试过您的解决方案。我得到了意想不到的结果。查看我编辑的帖子。
    • diktecolumn 必须是数字格式才能按预期工作。我猜您使用的是文本列,因此6 按字母顺序排列在10 之后
    • 字段dikte设置为decimal(4,1)
    • 但是在您的第一个子查询中,您选择 dikte 作为 '' 这使得它被覆盖为字符串值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2014-06-19
    相关资源
    最近更新 更多