2009-12-14 99 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"; 
    } 
    } 
}