简体   繁体   English

MySQL在UNION语句中的排序依据

[英]MySQL Order By in UNION statement

I have this MySQL query, the query is not giving any errors. 我有这个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)
    ";

But the query is not ordering inh_plt.dikte ASC 但是查询没有排序inh_plt.dikte ASC

When searching this website and Google is seems that an sub-query can not be ordered? 在搜索此网站和Google时,似乎无法订购子查询? But in this Stackoverflow page is an solution. 但是在此Stackoverflow页面中是一种解决方案。

So am I misunderstanding something? 那我误会了吗? Please advice. 请指教。

Query as Steve T suggested and where result is 6/5/10 按照Steve T的建议进行查询,结果为6/5/10

$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";

Both of the queries order their results but when you union them they won't show in the order you expected. 这两个查询都会对结果进行排序,但是当您合并它们时,它们将不会按照您期望的顺序显示。 You could add an envolving select query with your two existing queries inside of it and then order by the field you need. 您可以在其中添加一个包含两个现有查询的旋转选择查询,然后按所需字段进行排序。

EDIT: 编辑:

Something like: 就像是:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM