烧脑,一般人理解都理解不了,唯有求教真正的大神关于php sql 树查询输出的问题

rcznh 2017-12-12 05:01:25
前几天发了一贴,感谢m0_38030271回复,帮忙实现了部份功能,http://bbs.csdn.net/topics/392294418

由于描述不全,现重新发贴,写出真正需求,请大神帮忙,谢谢!

member
name sh yz id
a111108 7 12 8
a111109 8 0 9
a111110 9 5 10
a111111 10 0 11
a111112 11 18 22
a111113 22 9 23
a111114 23 15 24
a111115 24 12 25
a111116 25 5 26
a111117 26 0 27
a111118 27 9 28
a111119 28 5 29
a111120 29 5 30
a111121 30 0 31
a111122 31 0 32
……


有以上表,sh为接点,即a111112由a111111推荐,a111113由a111112推荐……以此类推,
yz为级别,现想查出 某个用户名 往上第一个不同级别的ID号

比如现在想查询a111122往上的不同级别的推荐人,正常情况下,a111122的推荐人是a111121,但由于a111121级别即yz这个字段为0,那么就要继续往上查,查到a111120级别为5,a111120就是第一个要输出的,由于a111120的级别不是最大的级别18,所以要继续往上查,查到a111119级别yz为5,和前面的a111120一样,就跳过,查询到a111118为9,那么第二个输出即为a111118,继续再往上查,a111115为第三个输出a111114为第四个输出a111112为第5个输出,即往上直至查询到最大级别18为止。同时计算出和前面的级别相差多少:

用户名 级别 相差
echo "a111120 5 5";//5-0
echo "a111118 9 4";//9-5
echo "a111115 12 3";//12-9
echo "a111114 15 3";//15-12
echo "a111112 18 3";//18-15

$q_01="select * from member where name='a111121'";//
$r_01=mysql_query($q_01);
$a_01=mysql_fetch_array($r_01);

echo "$a_01[name] $a_01[sh]";//这样只能输出得到a111120的ID=30,如何写才能得到如上想要的输出结果

再比如查询a111114,a111113为第一个输出,a111112为第二个输出,查询到a111112级别已为18,即停止查询:

用户名 级别 相差
echo "a111113 9 9";//9-0
echo "a111112 18 9";//18-9

再比如查询a111111,a111110为第一个输出,a111108为第二个输出:

用户名 级别 相差
echo "a111110 5 5";//5-0
echo "a111108 12 7";//12-5
echo "";//空
也就是说如果查到头如没有最大18的级别,那也就停止查询,输出为“空”。

要求即是指定某个用户名,往上查,输出第一个不同级别的用户名、相应的级别及级别之间相差多少?

请高手帮忙,谢谢!
...全文
161 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34139573 2017-12-13
  • 打赏
  • 举报
回复
$name="a111120";

$arr = array();
$sql = "select * from aoma_test where name = '$name'";
$res =mysql_query($sql);
$info=mysql_fetch_array($res);

function get_data($info,$arr){

	$sql = "select * from aoma_test where id = {$info['sh']}";
	$res =mysql_query($sql);
	$info=mysql_fetch_array($res);

	if($info){
		if(!isset($arr[$info['yz']]) && $info['yz']!=0){
			$arr[$info['yz']] = $info;
			if($info['yz']==18) return $arr;
		}

		return get_data($info,$arr);
	}else{
		return $arr;
	}
}

$arr = get_data($info,$arr);
$pre_k = 0;
foreach ($arr as $k => $v) {
	echo $v['name'].' '.$k.' '.($k-$pre_k).'<br>';
	$pre_k = $k;
}
rcznh 2017-12-13
  • 打赏
  • 举报
回复
引用 1 楼 qq_34139573 的回复:
非常感谢!

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧