SQL nested order by?

前端 未结 4 1536
渐次进展
渐次进展 2020-12-19 13:13

I\'m sure that this has been asked before, but I don\'t know what to call it exactly to find the answer.

I have a table of categories and sub categories. They each

4条回答
  •  粉色の甜心
    2020-12-19 14:02

    an answer has already been accepted, but i thought i would share my thoughts on this anyways. i tried to sort the main categories after their display_order column as well. here's my table

    mysql> select * from categories;
    +-------------+---------------+-----------+---------------+
    | category_id | category_name | parent_id | display_order |
    +-------------+---------------+-----------+---------------+
    |           1 | B             |         0 |             2 |
    |           2 | C             |         0 |             3 |
    |           3 | b2            |         1 |             2 |
    |           4 | b1            |         1 |             1 |
    |           5 | c3            |         2 |             3 |
    |           6 | A             |         0 |             1 |
    |           7 | c2            |         2 |             2 |
    |           8 | b3            |         1 |             3 |
    |           9 | a2            |         6 |             2 |
    |          10 | a1            |         6 |             1 |
    |          11 | c1            |         2 |             1 |
    |          12 | a3            |         6 |             3 |
    +-------------+---------------+-----------+---------------+
    12 rows in set (0.00 sec)
    

    as you see, i have taken great care to add the categories in a none linear order :)

    my query:

    SELECT
        sub_id AS category_id,
        sub_name AS category_name,
        sub_parent_id AS parent_id,
        main_order + sub_order AS display_order
    FROM (
        SELECT
            c1.display_order + c1.display_order * (
                SELECT
                    inner_c.display_order
                FROM
                    categories AS inner_c
                WHERE
                    inner_c.parent_id <> 0
                ORDER BY
                    inner_c.display_order DESC
                LIMIT 1) AS main_order,
            c2.display_order AS sub_order,
            c2.category_name AS sub_name,
            c2.category_id AS sub_id,
            c2.parent_id AS sub_parent_id
        FROM
            categories AS c1
        JOIN
            categories AS c2
        ON
            c1.category_id = c2.parent_id
        WHERE
            c1.parent_id = 0
        ) AS renumbered
    UNION ALL
    SELECT
        category_id,
        category_name,
        parent_id,
        display_order + display_order * (
            SELECT
                inner_c.display_order
            FROM
                categories AS inner_c
            WHERE
                inner_c.parent_id <> 0
            ORDER BY
                inner_c.display_order DESC
            LIMIT 1) AS display_order
    FROM
        categories
    WHERE
        parent_id = 0
    ORDER BY
        display_order;
    

提交回复
热议问题