2014-09-05 57 views
3

我正在分組類型系統凡在我表分組,父分組(id這是主鍵)和它的N- -SUB分組是下(parent_id)存儲,下面是我的表結構:分組和N-子分組MSQL查詢(同catgeory和N個子catgeory)

Packet_table

id | packet_name | parent_id | 
------------------------------ 
1 | 01  | 0 
2 | 02  | 0 
3 | 03  | 1 
4 | 04  | 1 
5 | 05  | 1 
6 | 06  | 4 
7 | 07  | 4 
8 | 08  | 3 
9 | 09  | 5 
10 | 010  | 2 
........................so on and on with N packets in same table 

下面是我試圖但其沒有得到id N個子數據包正確細節:

SELECT p.`packet_name` AS MAIN, s.`packet_name` AS SUB 
FROM packet_table s 
LEFT JOIN packet_table p ON s.`parent_id` = p.`id` 

這就是按照上述表:ID(這是主/自動增量)

ID = 1 - >主要分組(01),它的子和N個子包是:

01 - > 03,04,05

04 - > 06,07

03 - > 08

05 - > 09

總之

01 -> 03 -> 08 
     04 -> 06 , 07 
     05 -> 09 

其上面的設計格式MySQL的代碼沒有必要..只是簡單的N個子包查詢會做

以上僅僅是少數,但在我的情況下,每個(id)都會有N個子數據包。

注意:它可以是相同的類別和N子類別類型,也請注意,如上所述我不希望查詢如上所述(作爲樹)..我只需要只有MySQL查詢任何格式..

1}只需要的是當我用ID搜索= 1,那麼結果一定會給我所有子包和其N個子子包,

2}當我與任何子包ID進行搜索,那麼它結果應該給我它的子數據包和它的所有N個子數據包,依此類推......也是這個子數據包是哪個主包和vise verse。

UPDATE:請檢查下面的格式查詢我需要一些有N個包

Table Format 1 : thats Main Packet 
+------------+------------+----------+ 
| Main Pkt | Sub Packet | COUNT(*) | 
+------------+------------+----------+ 
| 01   | 03   |  1 | 
| 01   | 04   |  1 | 
| 01   | 05   |  1 | 
-------------------------------------- 

二:

Table Format 2 : thats Sub and Its N sub Packet 
+------------+------------+-----------------+ 
| Main Pkt | Sub Packet | N Sub Packet | 
+------------+------------+-----------------+ 
| 01   | 03   |  08  | 
| 01   | 04   |  06  | 
| 01   | 04   |  07  | 
| 01   | 05   |  09  | 
--------------------------------------------- 

三:

Table Format 2 : thats Sub and Its N sub Packet 
+------------+------------+-----------------+ 
| Main Pkt | Sub Packet | N Sub Packet | 
+------------+------------+-----------------+ 
| 01   | 03   |  08  | 
| 01   | 04   |  06  | 
| 01   | 04   |  07  | 
| 03   | 011  |  014  | -- ***** 
--------------------------------------------- 
above ***** : here 03 is actually sub packet of 01 hence it query will also help me 

因此,01 - 03 - 011 - 014

+0

這裏的任何一個什麼 – user3209031 2014-09-05 06:40:55

+0

還在等待查詢:( – user3209031 2014-09-09 09:42:03

+0

正如你發現的那樣,MySQL不支持遞歸「開箱即用」。選擇包括按照需要經常加入表,創建某種類型的sproc,切換到另一種數據模型(例如嵌套集合),或者在應用程序級別處理遞歸邏輯(在這種情況下,使用PHP循環)。所有這些選項都已經在示例中討論過(這裏,和其他地方) – Strawberry 2014-09-10 09:54:08

回答

1

爲了能夠在一個查詢中獲取所有子項,您可以重構表,以便將數據包數據存儲爲nested-set model

從數據樣本建立一個樹狀結構:

 0 
    / \ 
    1  2 
/| \ \ 
    3 4 5 10 
    | |\ \ 
    8 6 7 9 

表:

+-------+--------------+-----+-----+ 
| id | packet_name | lft | rgt | 
+-------+--------------+-----+-----+ 
|  0 | 00   | 1 | 22 | 
|  1 | 01   | 2 | 17 | 
|  2 | 02   | 18 | 21 | 
|  3 | 03   | 3 | 6 | 
|  4 | 04   | 7 | 12 | 
|  5 | 05   | 13 | 16 | 
|  6 | 06   | 8 | 9 | 
|  7 | 07   | 10 | 11 | 
|  8 | 08   | 4 | 5 | 
|  9 | 09   | 14 | 15 | 
| 10 | 010   | 19 | 20 | 
------------------------------------ 

得到一個子樹的所有節點與根01

SELECT node.packet_name 
FROM Packet_table AS node, 
    Packet_table AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND parent.packet_name = '01' 
ORDER BY node.lft; 

輸出:

01, 03, 08, 04, 06, 07, 05, 09 

另一種解決方案是在PHP端創建一個循環,並遞歸地獲取所有子項(請參閱recursive function to get all the child categories)。

+0

+1,嘿感謝偉大的支持將檢查以上溶膠ution。 – user3209031 2014-09-11 11:12:35