通过引用对列表进行排序
问题描述:
我有一个包含(基本上)三列的表 - 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使用来创建它的东西。我能想到的唯一办法是非常浪费,我相信还有更好的办法。
在此先感谢!
答
--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
答
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";
}
}
}
你有两个以上的级别? – 2009-12-14 10:25:50
是的,它的水平一直下降(理想)。 – Meep3D 2009-12-14 10:46:28