Php MySQL中具有左右组的分层查询
我有一个表,有两列username和leaderPhp MySQL中具有左右组的分层查询,php,mysql,hierarchical,Php,Mysql,Hierarchical,我有一个表,有两列username和leader login_user sponsered_id right_left test1 admin Right test2 admin Left test3 test1 Right test4 test1 Left test43 test2 Left
login_user sponsered_id right_left
test1 admin Right
test2 admin Left
test3 test1 Right
test4 test1 Left
test43 test2 Left
test44 test3 Left
我有一个函数
function display_children($parent, $level) {
// retrieve all children of $parent
$result = mysql_query('SELECT name, login_user, right_left FROM members_list '.
'WHERE sponsered_id="'.$parent.'";');
while ($row = mysql_fetch_array($result)) {
// indent and display the title of this child
echo '<tr><td>'.
$row['login_user'].' </td><td> '.$row['right_left'].' </td><td> '.$row['sponsered_id'].
"</td></tr>";
// call this function again to display this
// child's children
display_children($row['login_user'], $level+1);
}
}
echo display_children('admin',0);
需要输出为
test1 Right admin
test2 Left admin
test3 Right test1
test4 Left test1
Right test2
test43 Left test2
Right test3
test44 Left test3
你可以试试这个
select login_user , right_left , sponsered_id from (
select login_user , right_left , sponsered_id
from members_list
union all
select login_user , if(right_left ='left', 'right', 'right' ) right_left , sponsered_id
from members_list
)t
group by sponsered_id, right_left
order by login_user
试试这个
SELECT
login_user,
right_left,
sponsered_id
FROM (
SELECT
login_user,
right_left,
sponsered_id
FROM
members_list
UNION
SELECT
NULL,
CASE when max(right_left) ='Left' THEN 'Right' ELSE 'Left' END AS right_left,
sponsered_id
FROM
members_list
GROUP BY
sponsered_id
HAVING count(sponsered_id) < 2
) as temp
ORDER BY
sponsered_id,
right_left
您声明的输出与数据库中的值不匹配:Right test2不存在。我认为你应该通过登录用户对结果进行排序,并且你应该非常接近你所说的输出。我想正如高所建议的,对结果集进行排序可能会给你带来更理想的输出。另外,我建议使用嵌套的集合模型层次数据,它更容易处理和遍历层次结构中的节点和分支。@Kao那是wt我的问题是某些值不在右边或左边,它应该显示为空白…thx以供回答。。。。但它给出了错误的输出,正如你们所看到的,test2和test3都不正确,但demo给出了错误的输出;输出错误?很像你的。是的,测试2没有右边,它不显示右边,它显示左边。我不明白你的意思,如果你看到测试43同时出现在右边和左边。。。这是错误的,因为“正确的测试2”是空白的,所以它应该在那里显示空白,它的工作。。。但是我可以使用WHERE-sponsered_id=吗?因为我需要根据sponsered_id进行输出???@Harinder,当然,您可以将它添加到最外层的WHERE子句中
SELECT
login_user,
right_left,
sponsered_id
FROM (
SELECT
login_user,
right_left,
sponsered_id
FROM
members_list
UNION
SELECT
NULL,
CASE when max(right_left) ='Left' THEN 'Right' ELSE 'Left' END AS right_left,
sponsered_id
FROM
members_list
GROUP BY
sponsered_id
HAVING count(sponsered_id) < 2
) as temp
ORDER BY
sponsered_id,
right_left