2009-12-14 5 views
1

У меня есть таблица, содержащая (по существу) три столбца - id, name, ref_id.Сортировка списка по ссылкам

Я хотел бы создать отступ список, в котором столбцы с ref_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 и использования процессора. Единственный способ, которым я могу это сделать, невероятно расточителен, и я уверен, что есть лучший способ.

Заранее благодарен!

+1

Есть ли у вас более двух уровней? –

+0

Да, это уровни полностью вниз (в идеале). – Meep3D

ответ

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

+0

Не уверен ... Я сделал это с манжетой. –

1

РНР версия

$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"; 
    } 
    } 
} 
Смежные вопросы