2009-12-12 254 views
1

我有一個名爲「角色」需要一個MySQL查詢

id | parent_id | name 
---+-----------+-------------------- 
1 | NULL  | Machine 
2 | 3   | Ram 
3 | 4   | Cpu 
4 | NULL  | Computer 
5 | NULL  | Electronic Device 

我需要一個(MySQL或postgress SQL)查詢,這將給某個特定角色的可能父母表。

例如

'計算機' 的可能的父角色

id | name 
---+------------------- 
5 | Electronic Device 
1 | Machine 

請幫我

+2

似乎在提供的數據中沒有邏輯關聯。 –

+0

我不認爲它可能在單個查詢中 – Xinus

+0

@astander:我認爲lintdavis想要問的是 - 他在同一張表中引用了記錄,並且他希望列出在單個查詢中給定特定記錄的所有引用鏈 – Xinus

回答

3

用途:

SELECT t.id, 
     t.name 
    FROM ROLES t 
WHERE t.parent_id IS NULL 
    AND t.name != ? 

...其中?是什麼name如果它的parent_id爲空,則要排除它。

+2

這是在黑暗中的一槍? –

+3

null是parent_id的可能性,以便沒有父母。 –

+0

可能有數百個空條目,其中「計算機」是一個。那應該不是自己的根? –

1

忽略你的例子中的數據不匹配的事實,我認爲你要做的是在數據庫中存儲和獲取分層數據,最終得到一系列父母和孩子。

存儲和檢索這種數據有幾種方法。我強烈建議您閱讀本文的Sitepoint文章:Storing Hierarchical Data in a Database

最常見的方法是鄰接列表模型,您可以選擇第一條記錄,然後選擇它的父項,然後選擇它的父項等,直到獲得整條記錄鏈。這是一種閱讀繁重的書寫方式,並且易於實施。

如果你想要一個快速讀取的方法,修改預置樹遍歷(第2頁)是一個了不起的算法。實現起來更加困難,但是您可以在單個SELECT中選擇整個子/父記錄集。

1

根據其他用戶的評論(可能缺乏完整的數據),它看起來像是一個自我參照表。因此,如果數據被修正,你可以嘗試

select r2.* 
from role as r1 inner join 
role as r2 on r1.parent_id=r2.id 
where r1.name='Computer'; 

數據是

id | parent_id | name 
---+-----------+-------------------- 
1 | NULL  | Machine 
2 | 3   | Ram 
3 | 4   | Cpu 
4 | 1   | Computer 
5 | NULL  | Electronic Device