簡體   English   中英

MySQL內部聯接可對同一表中的父項,子項和孫子項進行排序

[英]MySQL inner join to sort parent, child and grand-child from the same table

MySQL數據庫在“ mailshot”表中均包含城鎮內的國家/地區,城鎮和區域。 我想使用降序和內部聯接按降序返回整個集合。 我實際上是想向用戶顯示一個下拉列表,供他們選擇城鎮中的國家或地區。

數據如下所示:

mailshot_id   mailshot_parent   mailshot_name   mailshot_level 
49              0               England         0
56              0               Scotland        0
140             49              London          1
149             49              York            1
191             56              Glasgow         1
300             140             Wimbledon       2
310             140             Westminster     2 
493             56              Edinburgh       1

我想要這樣的輸出:

mailshot_id   mailshot_parent   mailshot_name   mailshot_level 
49              0               England         0
149             49              York            1
140             49              London          1
300             140             Wimbledon       2
310             140             Westminster     2 
56              0               Scotland        0
191             56              Glasgow         1
493             56              Edinburgh       1

我幾乎可以做到這一點:

SELECT
    p.mailshot_id as p_id, 
    p.mailshot_name as p_name, 
    p.mailshot_level as p_level,
    p.mailshot_parent as p_parent, 
    c.mailshot_id as c_id, 
    c.mailshot_parent as c_parent, 
    c.mailshot_level as c_level, 
    c.mailshot_name as c_name, 
    case 
        WHEN p.mailshot_parent  = 0 THEN 
        p.mailshot_id 
        ELSE 
        p.mailshot_parent 
    END AS calcOrder 
FROM
    mailshot p LEFT JOIN mailshot c
    ON p.mailshot_id = c.mailshot_parent 
ORDER BY   calcOrder , p_id "

但這並不是將子級記錄(級別2)與子級記錄(級別1)分組在一起,我認為“案例”部分一定是錯誤的,並且我需要根據級別在mailshot_id和parent_id之間建立某種關系。 但是我不敢想。

有什么建議么? 提前致謝。

不幸的是,MySQL不支持分層查詢(沒有START WITH ... CONNECT BY或CTE等效項)。 因為您需要以艱苦而丑陋的方式進行此操作。

以下內容適用於您的3個級別,但是如果您需要更大的樹深,則會變得非常麻煩。 這是小提琴

SELECT  C.MAILSHOT_ID
        ,C.MAILSHOT_PARENT
        ,C.MAILSHOT_NAME
        ,C.MAILSHOT_LEVEL
        ,CASE   WHEN C.MAILSHOT_LEVEL = 0 
                THEN CAST(C.MAILSHOT_ID AS CHAR(4))
                WHEN C.MAILSHOT_LEVEL = 1 
                THEN CONCAT(CAST(C.MAILSHOT_PARENT AS CHAR(4)),"..",CAST(C.MAILSHOT_ID AS CHAR(4)))
                ELSE CONCAT(CAST(P.MAILSHOT_PARENT AS CHAR(4)),"..",CAST(C.MAILSHOT_PARENT AS CHAR(4)),"..",CAST(C.MAILSHOT_ID AS CHAR(4)))
        END AS SORT_ORDER    
FROM    MAILSHOT C
LEFT OUTER JOIN
        MAILSHOT P
ON      P.MAILSHOT_ID = C.MAILSHOT_PARENT       
ORDER BY CASE   WHEN C.MAILSHOT_LEVEL = 0 
                THEN CAST(C.MAILSHOT_ID AS CHAR(4))
                WHEN C.MAILSHOT_LEVEL = 1 
                THEN CONCAT(CAST(C.MAILSHOT_PARENT AS CHAR(4)),"..",CAST(C.MAILSHOT_ID AS CHAR(4)))
                ELSE CONCAT(CAST(P.MAILSHOT_PARENT AS CHAR(4)),"..",CAST(C.MAILSHOT_PARENT AS CHAR(4)),"..",CAST(C.MAILSHOT_ID AS CHAR(4)))
        END

這是層次結構表的典型示例,在oracle中更易於查詢,但這不重要。 @Declan_K給您一個很好的答案,以實現您想要的。 如果您正在尋找一種可以使輸出仍然井井有條的替代方案,那么您可以嘗試以下方法:

SELECT m1.mailshot_name AS lev1n ,           
       m1.mailshot_id AS lev1,
       m1.mailshot_parent AS lev1p,
       m2.mailshot_name AS lev2n,
       m2.mailshot_id AS lev2,
       m2.mailshot_parent AS lev2p,
       m3.mailshot_name lev3n,
       m3.mailshot_id lev3,
       m3.mailshot_parent AS lev3p
FROM mailshot m1
LEFT JOIN mailshot m2 ON m2.mailshot_parent = m1.mailshot_id
LEFT JOIN mailshot m3 ON m3.mailshot_parent = m2.mailshot_id
WHERE m1.mailshot_parent = 0;

給出輸出:

+----------+------+-------+-----------+------+-------+-------------+------+-------+
| lev1n    | lev1 | lev1p | lev2n     | lev2 | lev2p | lev3n       | lev3 | lev3p |
+----------+------+-------+-----------+------+-------+-------------+------+-------+
| England  |   49 |     0 | London    |  140 |    49 | Wimbledon   |  300 |   140 |
| England  |   49 |     0 | London    |  140 |    49 | Westminster |  310 |   140 |
| England  |   49 |     0 | York      |  149 |    49 | NULL        | NULL |  NULL |
| Scotland |   56 |     0 | Glasgow   |  191 |    56 | NULL        | NULL |  NULL |
| Scotland |   56 |     0 | Edinburgh |  493 |    56 | NULL        | NULL |  NULL |
+----------+------+-------+-----------+------+-------+-------------+------+-------+

可以在以下位置找到有關如何在MySQL中處理分層數據的良好摘要:
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM