Php 按引用对列表排序

Php 按引用对列表排序,php,mysql,Php,Mysql,我有一个包含(基本上)三列的表——id、name、ref\u 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 理想情况下会创建如下内容: ab

我有一个包含(基本上)三列的表——id、name、ref\u 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使用量创建它的话。我能想到的唯一方法是难以置信的浪费,我相信还有更好的方法

提前谢谢

PHP版本

--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;
$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";
    }
    }
}

你有两个以上的关卡吗?是的,一路下来都是关卡(理想)。酷!看起来不错,是否有最低版本的MySQL可以使用?不确定。。。这是我即兴做的。