2014-01-23 24 views
0

我只是想找到一種方法來使服務器資源有效的方式來排序和顯示按字母順序排序的父/子結構。我不是一個專業的程序員,所以我下面的代碼是蹩腳的,但它的工作原理,也許你可以幫助我優化它。優化MYSQL + PHP的父子輸出

表是

ID,parentId的,名稱。

parentid對於父母是0,對於孩子是= id。

的任務是顯示按字母順序排列的父母和父母下的所有孩子,也按字母順序排序。所有項目都應該有名稱及其相應的ID。結構是這樣的:

AAA 
BBB 
-> eee of BBB 
-> ooo of BBB 
-> zzz of BBB 
CCC 
DDD 
-> mmm of DDD 
-> nnn of DDD 
EEE 
FFF 
... 

這是我的笨代碼,但是,它的工作原理。 MySQL按字母順序對所有項目進行排序,PHP僅通過已排序的名稱進行循環,爲每個父項選擇並顯示子項。 我不喜歡爲每個父項目運行的額外循環,也許有人可以建議在性能方面更好的方法

$sqlquer="SELECT id, parentid, name FROM mytable ORDER BY name"; 
    $ath = mysql_query($sqlquer); 

    while ($row = mysql_fetch_array($ath)) { 
    if ($row[parentid]==0) $parents[]=$row; 
     else $children[]=$row; 
} 

foreach($parents as $par) 
{ 
echo("$par[name]($par[id])<br>"); 
    foreach($children as $ch) 
    { if ($ch[parentid]==$par[id]) 
       echo("->$ch[name]($ch[id])<br>"); 
    } 
} 
+0

這裏有一個類似的情況就像你..你可以修改解決方案,並使用它像你的輸出http://stackoverflow.com/questions/21306338/php-mysql-multidimensional-array-dropdown-menu/21308976#21308976 –

+0

這實際上是慢嗎? – Steve

+0

我沒有得到什麼你的意思是慢? –

回答

0
select 
    if (b.parentid is null, a.name, concat('->', a.name, ' of ', b.name) 
    fieldname 
from 
    table a 
left 
    join table b 
on 
    a.parentid = b.id 
order by 
    if (b.parentid is null, a.name, b.name), 
    a.name 

對不起,沒有格式和非正式的響應,但現在我是從移動。希望它有效,我沒有測試過,因爲任何問題你都可以聯繫我。使用此解決方案,您只需在一個查詢中執行所需操作,並且應返回已排序的結果。

+0

它只適用於一級孩子,我認爲MySQL中不支持遞歸查詢。 – matteospampani

+0

當父母有孩子時,它有一個奇怪的排序行爲。我有一些像 '一個單親 B-父 - >下的-子項目 - 的 - - > B-supitem-的-C C-父 - > c^d-子項目 - 的 - - >的** **代替一個 父 b-父 C-父 ç電子子項目-的- - >℃的-子項目-的- - > C b-supitem-的- - > d-subitem-of-c - > e-subitem-of-c' 此外,我不知道如何從原始數據中獲取其他值,例如我的例子中的id,編寫 'c-parent ID) - > a-subitem-of-c(id) ...' – TOL

+0

嗨,我現在用下表對其進行了測試:CREATE TABLE mytable( id int(11)unsigned NOT NULL AUTO_INCREMENT, parentid int(11)unsigned NOT NULL, name char(50)NOT NULL DEFAULT'', PRIMARY KEY(d) )ENGINE = InnoDB AUTO_INCREMENT = 12 DEFAULT CHARSET = utf8;'以及下面的數據'INSERT INTO mytable(id ,parentId的,名稱) VALUES(1,0, 'AAA'),(2,0, 'BBB'),(3,0, 'CCC'),(4,0, 'DDD'),(5, 0,'EEE'),(6,0,'FFF'),(7,2,'eee'),(8,2,'ooo'),(9,2,'zzz'), 4,'mmm'),(11,4,'nnn');'。這裏輸出:[link](http://www.tiikoni.com/tis/view/?id=24592c1)。可以嗎? – matteospampani