按引用对列表进行排序

时间:2009-12-14 10:24:04

标签: php mysql

我有一个包含(基本上)三列的表 - 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使用创建它。我能想到这样做的唯一方法是非常浪费,我相信有更好的方法。

提前致谢!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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";
    }
    }
}