一个关于排列的问题。想了很久不知道。太菜了。请大家帮帮忙。300分献上!在线等。可以了再发两贴补上另外200分啊!

Tyler_King 2008-08-03 01:07:39

请大家帮帮忙解决这个问题。客户老是在崔了。真的是受不了了。这个问题其实不是很难,只是我的技术太菜了。所以才来请大家帮助我一下。
(注:这个问题说容易不容易说难不难。我考虑了很久都不对。也考虑了很多方法。总觉得有些不好。请大家仔细考虑一下。)

问题如下:

有一个用户表
用户是按照树形排列的。
如图:
A
B1 B2 B3 B4
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16

每个用户下面都有四个的。(顺便说一下这是一个搞直销的公司)也就是说B1到B4都是A介绍的。而C1到C4都是B1 介绍 C5到C8是B2介绍 。。。。。
就这样一直下去。可以无数的循环下去。我现在的目地就是说只要循环七层就可以了。
(A不一定是在顶层。可能在中某个位置。)

第一层 1个
第二层 4个
第三层 16个
第四层 64个
第五层 256个
第六层 1024个
第七层 4096个
第八层 16384个

如果用户全部满了的就是这样子的。这个人下面就有(从第二层开始相加到第八层)这么多的人。可是这是不确定的。
问题来了。我要怎么设计数据库的表呢。怎么得出下面到底有多少人呢。
(最顶层是没有封的。也就是说如果直接到公司来的就是没有介绍人。是自己来的。父类ID就等于NULL)

请大家帮忙思考一下。写出思路,用户表是怎么设计的。然后是怎么样一个查询的方法。越详细越好。谢谢!如果觉得分不够我再加。谢谢。(在线等)加我的QQ也可以3387987
...全文
289 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tyler_King 2008-08-07
  • 打赏
  • 举报
回复
我会的。在什么时候用什么样的方法。那是肯定的了
Tyler_King 2008-08-04
  • 打赏
  • 举报
回复
忘记了说数据库的设计了。

userid username upid 其它字段就没写了。呵呵
Tyler_King 2008-08-04
  • 打赏
  • 举报
回复
谢谢大家的回答,我也是想了很久都不明白才发个贴子的。

现问题已经解决了。我顺便写出答案供大家参考学习。这里顺便提一下特别感谢atlasroben 也就是三楼的南宫天天。

他提出的方法是正确可行的。其它很多方法我们也考虑过。太麻烦了。不好计算。如果数据一多的话会给以后的修改造成很大的麻烦。

但是我还是非常感谢各位的回答。

再说一句谢谢。

下面是代码:


private int Count = 0;   //总个数
private int intcheng = 0;                      //总层数
protected void btn_UserSelectCh_Click(object sender, EventArgs e) //计算下线的按钮
{
SqlConnection con = ConSqlClass.CreateConnection();
con.Open();

string str = "select * from useradmin";          //查询所有用户数据

SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(str, con);
DataSet ds = new DataSet();
sda.Fill(ds, "table");                    //把所有数据在表中

DataRow[] drs = ds.Tables[0].Select("upid='" + UserId.UserNum + "'");  //得到上级ID的数据
int all = 0;
intcheng = 6;                               //一共记算七层。所以intcheng等于六
foreach (DataRow dr in drs)                        //开始遍历
{
Count = 0;
fillnode(Convert.ToInt32(dr["id"]), ds.Tables[0], 0);
all += Count;
}

this.lb_UserNum.Text = all.ToString();

}

private void fillnode(int id, DataTable dt, int dep) //遍历方法
{
if (dep < intcheng)
{
DataRow[] drs = dt.Select("upid='" + id + "'");
foreach (DataRow dr in drs)
{
Count++;
fillnode(Convert.ToInt32(dr["id"]), dt, dep++);
}
}
}
qinqinhao 2008-08-04
  • 打赏
  • 举报
回复
ding
ding
wdgphc 2008-08-04
  • 打赏
  • 举报
回复
有事烧纸
knifesky 2008-08-04
  • 打赏
  • 举报
回复
如果以后,当你用很复杂的运算也很难得到一些你想要的数据或想实现的操作的时候,希望你能回头看看这个帖子。

前车之鉴,后世明灯......
  • 打赏
  • 举报
回复
学习一下
say_what 2008-08-03
  • 打赏
  • 举报
回复
我就是照着我所理解的说吧,可能说得不对,因为我看得不是很明白:
其实一张表就足够了,只是当然记录很多时,查询起来可能费时一点.
表user:(以为最大10层为例,以下是表字段)
parentID1,parentID2,parentID3,parentID4,parentID5,parentID6,parentID7,parentID8,parentID9,
currentID

录入人员信息时,以这种方式:
如果这个人没有谁介绍,直接 "insert into user values ('NULL','NULL',............'userID')"
如果这个人是某某介绍的,那么在插入这个人信息的时候要把介绍人ID以及介绍人的parentID1---parentID9中
不为空的字段插入进来.

查询某某所介绍人的所有子树:
select * from user where parentID='某某id'
诸法空性 2008-08-03
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 axe6404 的回复:]
引用 20 楼 wdgphc 的回复:
引用 13 楼 wdgphc 的回复:
第一层 1个 A
第二层 4个 AA AB AC AD
第三层 16个 AAA AAB AAC AAD ABA ABB ABC ABD ACA ACB ACC ACD ADA ADB ADC ADD
第四层 64个 AAAA AAAB... AABA...ADDD
第五层 256个 AAAAA ....ADDDD
第六层 1024个 AAAAAA... ADDDDD
第七层 4096个 ...
第八层 16384个 ...


你第8层,第9层,第10层也不过只需要一个8,9,10位的ID就可以…
[/Quote]

错了
应该是36*36*36*36*36*36*36*36=2821109907456
诸法空性 2008-08-03
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wdgphc 的回复:]
引用 13 楼 wdgphc 的回复:
第一层 1个 A
第二层 4个 AA AB AC AD
第三层 16个 AAA AAB AAC AAD ABA ABB ABC ABD ACA ACB ACC ACD ADA ADB ADC ADD
第四层 64个 AAAA AAAB... AABA...ADDD
第五层 256个 AAAAA ....ADDDD
第六层 1024个 AAAAAA... ADDDDD
第七层 4096个 ...
第八层 16384个 ...


你第8层,第9层,第10层也不过只需要一个8,9,10位的ID就可以表示了.
而且这样你查询一…
[/Quote]

刚才想到了一个办法,对这个办法进行扩展,每一级可用英文字母和数字,这样编码的数量可以控制在8个字符,
而编码空间可以为:35*35*35*35*35*35*35*35=2251875390625个,足够了吧?
yuantaolzu 2008-08-03
  • 打赏
  • 举报
回复
友情帮顶
shadowjl 2008-08-03
  • 打赏
  • 举报
回复
A
A1 A2 A3 A4
A11 A12 A13 A14 A21 A22 A23 A24........
我觉得这样方便查上级
bwangel 2008-08-03
  • 打赏
  • 举报
回复
有很多人说算法没用,其实他们是没有遇到复杂的业务。
bwangel 2008-08-03
  • 打赏
  • 举报
回复
支持7楼的意见。

其实,关于树结构,早就有很多经典的算法。
qinqinhao 2008-08-03
  • 打赏
  • 举报
回复
ding
ding
zld_baggio 2008-08-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 isline 的回复:]
帮你顶
[/Quote]
papaya73 2008-08-03
  • 打赏
  • 举报
回复
这种方法的唯一麻烦的是生成ID编码时要多次查询,以找到一个可用的
wdgphc 2008-08-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wdgphc 的回复:]
第一层 1个 A
第二层 4个 AA AB AC AD
第三层 16个 AAA AAB AAC AAD ABA ABB ABC ABD ACA ACB ACC ACD ADA ADB ADC ADD
第四层 64个 AAAA AAAB... AABA...ADDD
第五层 256个 AAAAA ....ADDDD
第六层 1024个 AAAAAA... ADDDDD
第七层 4096个 ...
第八层 16384个 ...
[/Quote]

你第8层,第9层,第10层也不过只需要一个8,9,10位的ID就可以表示了.
而且这样你查询一个最终用户的直销代表及上级是谁,只需
select ID form t where username="客户名"
找到ID就很方便的根据Abdbdcdbabcbdba这种ID搜索他的任何一级,如果你只存他的父级,就麻烦得多.
如果你要查找一个人的所有下级,只需
select * from t where ID like %ab%
就能找出所有A->B 的所有下级.
xiaoxue1129 2008-08-03
  • 打赏
  • 举报
回复
顶 knifesky的方法啊
比用树,递归的方法好啊 !
suyiming 2008-08-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxg22526451 的回复:]
用户表:
ID
名称
介绍人ID

查询最好用递归
[/Quote]

用递归可以无限的循环下去
加载更多回复(17)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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