2014-09-12 88 views
1

我有一個包含以下字段(id,parent_id,name)的表'tags'。現在我已經在層次結構中設置了3個級別的限制,即:parent> child> subchild。子女不能有更多的孩子。所以我想查詢檢索記錄,如:在mysql中獲取父/子/子關係

家長數據 (如果父母有子)子數據 (如果孩子有subchild)subchild數據

回答

1

試着這麼做:

SELECT tparent.id AS parent_id, 
     tparent.name AS parent_name, 
     tchild1.id AS child_id, 
     tchild1.name AS child_name, 
     tchild2.id AS subchild_id, 
     tchild2.name AS subchild_name 
FROM tags tparent 
     LEFT JOIN tags tchild1 
       ON tparent.id = tchild1.parent_id 
     LEFT JOIN tags tchild2 
       ON tchild1.id = tchild2.parent_id 

根據您的評論,你看以下的輸出:

ID | PARENT | NAME 
1 |  0 | family 
2 |  1 | male 
3 |  2 | boy1 
4 |  2 | boy2 
5 |  1 | female 
6 |  5 | girl1 

我將認爲IDS不會永遠是我ñ這個順序,如果他們的原因,問題解決:)

我不確定你可以直接在SQL中實現這一點,而無需添加一些額外的信息,將用於排序。例如,你可以添加另一列來連接parent-child-subchild的id。例如:

-- parent 
SELECT CONCAT(LPAD(id, 6, '0'), '-000000-000000') AS order_info, 
     id           AS id, 
     parent_id         AS parent, 
     name          AS name 
FROM tags 
WHERE parent_id = 0 
UNION 
-- child 
SELECT CONCAT_WS('-', LPAD(tparent.id, 6, '0'), 
         LPAD(tchild1.id, 6, '0'), 
         '000000'), 
     tchild1.id, 
     tparent.id, 
     tchild1.name 
FROM tags tparent 
     INNER JOIN tags tchild1 
       ON tparent.id = tchild1.parent_id 
WHERE tparent.parent_id = 0 
UNION 
-- subchild 
SELECT CONCAT_WS('-', LPAD(tparent.id, 6, '0'), 
         LPAD(tchild1.id, 6, '0'), 
         LPAD(tchild2.id, 6, '0')), 
     tchild2.id, 
     tchild1.id, 
     tchild2.name 
FROM tags tparent 
     INNER JOIN tags tchild1 
       ON tparent.id = tchild1.parent_id 
     INNER JOIN tags tchild2 
       ON tchild1.id = tchild2.parent_id 
ORDER BY 1 

請參閱the fiddle說明這一點。

在這裏,我格式化的ID保持排序連貫。這意味着知道ID的最大長度(我在這裏使用了6的長度),這從ID字段類型猜測是微不足道的。

+0

是的,我已經使用了這個,但是這使我得到了一個單一記錄中的完整節點。即: 父 - >子1 - > subchild 父 - >子2 - > subchild 不過,我想找回這樣的記錄: 家長 孩子1 subchild 孩子2 subchild – user3093048 2014-09-13 09:43:52

+0

請添加樣本輸出在你的問題中清楚地說明,但如果我理解你的需求,那麼你最好在你的表示層而不是SQL中做這件事。 – 2014-09-13 14:49:22

+0

以下是我想要生成的輸出。當我搜索名爲「家庭」的標籤時,應按照以下順序檢索我的孩子和子孩子。 輸出: 'ID,父,名稱 1,0,家庭 2,1,雄性 3,2,請分享幫助 4,2,boy2 5,1,女性 6,5,girl1' 我可以通過使用聯接解決方案在表示層中執行此操作,但爲此我需要使用一些檢查來組織數據。但是,如果有可能產生上面的輸出,請你幫助我。在此先感謝 – user3093048 2014-09-13 20:56:11