簡體   English   中英

如何編寫一個MYSQL查詢,它將返回嵌套在父項下的子項?

[英]How to write a MYSQL query that will return children nested under parents?

我不知道我問的是否可能,但這是我的情況。 我的表格有點像這樣:

+--------------------------------------------------+
|   id   |   parent_id   |   name   |   category   | ....
+--------------------------------------------------+
|    0   |       -1      |   item0  |      1       |
|    1   |        0      |   item1  |      1       |
|    2   |        0      |   item2  |      1       |
|    3   |        2      |   item3  |      1       | 
|    4   |        2      |   item4  |      1       | 
|    5   |       -1      |   item5  |      1       | 
+--------------------------------------------------+

parent_id為-1表示它是沒有父級的“基礎”項。 每個項目都有更多的信息列。 我需要以某種方式輸出嵌套的所有項目,如下所示:

item0 => item1    
      => item2
            => item3
            => item4  
item5  

我不知道這是否有意義,但希望它確實如此!

我能想到這樣做的唯一方法是進行查詢以獲取所有“基礎”項(查詢具有parent_id = -1的行)然后遍歷每個結果行,查詢其parent_id等於當前行的行行的id,然后重復該過程越來越深,直到基本項目沒有更多的子項。

有沒有更好的辦法?

謝謝!!

在純SQL中是不可能的。

SQL旨在處理關系數據而不是樹(分層數據)。

您可以在SQL模式中表示樹,但是您無法按照自己的意願生成樹。

唯一的方法是通過將盡可能多的連接作為您存儲的級別來獲得可用的結果。

您當前的架構可能支持多個級別,但是,管理多個或兩個級別將非常困難。

您可能對嵌套集模型管理mysql中的分層數據感興趣

有一些嵌套集的實現,就像這個與Doctrine 2一起使用

這在純SQL中是不可能的,它是產生大多數批評的關系模型的一個方面。

我建議你閱讀這篇文章的鏈接: SQL“樹狀”查詢 - 大多數父組

而且,如果您的應用程序過分依賴於此,我建議您查看一些可以更好地表示此類數據的非關系數據庫,例如MongoDB(www.mongodb.org)

我希望我能很好地理解你的問題(這里已經很晚了,我只是來自酒吧),如果我沒有,只要糾正我,我會改寫我的答案。

根據給出的情景,我猜有另一個父表,不是嗎?

讓我們想象它的屬性是id和name。 子表是您給定的一個(沒有不必要的屬性)。

mysql> insert into parent(name) values ('petr'),('tomas'),('richard');


mysql> insert into children(name,parent_id) values('michal',1),('tomas',1),('michal');


mysql> select parent.id,parent.name,children.name from parent left join children on parent.id = children.parent_id;

+----+---------+--------+
| id | name    | name   |
+----+---------+--------+
|  1 | petr    | michal |
|  1 | petr    | tomas  |
|  2 | tomas   | NULL   |
|  3 | richard | michal |
+----+---------+--------+

為了多次這樣做(父母得到孩子誰得到孩子等...)你可以通過使用多個連接來實現這一點。

mysql> select parent.id,parent.name as Parent,children.name as Child,children2.name as Child2 from parent left join children on parent.id = children.parent_id left join children2 on children.id = children2.parent_id;
+----+---------+--------+--------+
| id | Parent  | Child  | Child2 |
+----+---------+--------+--------+
|  1 | petr    | michal | NULL   |
|  1 | petr    | tomas  | dan    |
|  1 | petr    | tomas  | pavel  |
|  2 | tomas   | NULL   | NULL   |
|  3 | richard | michal | michal |
+----+---------+--------+--------+

如果我沒有回答你的問題,或者你需要進一步解釋,請告訴我;]

問候,

Releis

暫無
暫無

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

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