[英]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.