2009-12-14 84 views
1

我有一個包含(基本上)三列的表 - id,name,ref_id。通過引用對列表進行排序

我想創建一個縮進列表,其中有REF_ID列將與相應的ID欄下方縮進,例如:

Name  | ID | Ref ID 
about  1 0 
story  2 1 
history  3 1 
contact  4 0 
help  5 0 
map   6 4 
directions 7 4 

將理想創造這樣的事情:

about 
- story 
- history 
contact 
- map 
- directions 
help 

什麼是理想的是一個MySQL查詢將返回上面的完整列表,如果不是那些可以用最少量的SQL調用和cpu使用來創建它的東西。我能想到的唯一辦法是非常浪費,我相信還有更好的辦法。

在此先感謝!

+1

你有兩個以上的級別? – 2009-12-14 10:25:50

+0

是的,它的水平一直下降(理想)。 – Meep3D 2009-12-14 10:46:28

回答

1
--MySQL 5.1 happiness 
SELECT 
    CASE WHEN tp.Level = 1 THEN tp.Parent 
    ELSE CONCAT('- ', tp.Name) 
    END AS result 
FROM (

    SELECT 
    t.name, 
    CASE 
       WHEN t.ref_id = 0 THEN t.name 
       ELSE t2.name 
     END AS Parent, 
     CASE 
       WHEN t.ref_id = 0 THEN 1 
       ELSE 2 
     END AS Level 
    FROM question_1900097 t 
    LEFT JOIN question_1900097 t2 ON t.ref_id = t2.id 

    ) AS tp 
ORDER BY tp.Parent, tp.Name; 
+0

酷!看起來不錯,有沒有一個最低的MySQL版本可以使用? – Meep3D 2009-12-14 10:37:36

+0

不知道...我是在袖口處做的。 – 2009-12-14 10:49:54

1

PHP版本

$in = array(
    array('about',1,0), 
    array('story',2,1), 
    array('history',3,1), 
    array('contact',4,0), 
    array('help',5,0), 
    array('map',6,4), 
    array('directions',7,4) 
); 
foreach ($in as $k => $v) { 
    if ($v[2] === 0) { $out[$v[1]][0] = $v; }; 
    if ($v[2] > 0) { $out[$v[2]][1][] = $v;}; 
} 
foreach ($out as $k => $v) { 
    echo $v[0][0] . "\n"; 
    if (isset($v[1])) { 
    foreach ($v[1] as $sk => $sv) { 
     echo " - " .$sv[0] . "\n"; 
    } 
    } 
} 
相關問題