Php 按引用对列表排序
我有一个包含(基本上)三列的表——id、name、ref\u id 我想创建一个缩进列表,其中具有ref_id的列将缩进到具有相应id的列下面,例如: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
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可以使用?不确定。。。这是我即兴做的。