关于MYSQL递归的问题,谁能帮帮我?

xjw008 2003-08-20 11:31:10
关于MYSQL递归的问题,谁能帮帮我?

比如户籍问题:

一个人生了10个儿子,每个儿子可能又生了儿子,用什么办法能列出这个人的所有的家庭关系。

现在的表结构如下:(如果这种结构不科学应该怎么改?)

id username up
1 abc
2 efg abc
3 hij abc
4 kln efg
5 xyz efg

其中UP字段存储的是爸爸字段,然后再根据这个字段列出一个树型结构。

我用PHP循环列出来的话很慢。

mysql的SQL语句有没有办法能快速的列出来,这应该是一个递归问题吧!

谢谢大家!
...全文
142 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjw008 2003-08-23
  • 打赏
  • 举报
回复
怎么结不了贴?
xjw008 2003-08-23
  • 打赏
  • 举报
回复
谢谢大家,找到了一些思路,目前偿试,谢谢,以后还要麻烦大家!
ricochen 2003-08-21
  • 打赏
  • 举报
回复
pp是什么?
liyujie2000 2003-08-21
  • 打赏
  • 举报
回复
xuzuning(唠叨), xizi2002(☆☆戏☆子☆☆)
给出的方法不错,值得学习

对于这个问题,最好是先读到数组,再用数组遍历
xuzuning 2003-08-21
  • 打赏
  • 举报
回复
if(up='',username,up) as pp
如果up字段为空则取username字段内容,可理解为没有父亲的节点的父亲为自己

派生出的字段pp为排序用,以便将同一组的记录归在一起

不过这个方法只适用于二级,多了时不好弄。
xizi2002(☆☆戏☆子☆☆) 的方法可以,只是给taxis赋值是很麻烦的事情。因为他要罗列全部的父节点

按你的数据组织方式,通用点的还是编程
读取全部记录到数组(按up字段排序)
然后用递归函数遍历数组,以生成新数组。

按你的数据组织方式,一个儿子只会有一个父亲,一个父亲可能有多个儿子

xjw008 2003-08-21
  • 打赏
  • 举报
回复
xuzuning(唠叨) 谢谢您的回答,if(up='',username,up) as pp 是什么意思? pp是作什么用的!整个程序作何理解?再次感谢!
xuzuning 2003-08-21
  • 打赏
  • 举报
回复
刚才作了以下测试,感觉这样写是可以的

id username up
1 abc
2 efg abc
3 hij abc
4 kln efg
5 xyz efg
6 xxx abc

SELECT *,if(up='',username,up) as pp FROM `test1` order by pp,up

id username up pp
1 abc abc
2 efg abc abc
3 hij abc abc
6 xxx abc abc
4 kln efg efg
5 xyz efg efg
xizi2002 2003-08-21
  • 打赏
  • 举报
回复
xjw008(xjw):呵呵,就算他有40代.40*4=160个.taxis不过160个字符串吧.
不过你说的aa也有可能是别人的儿子是可以确定的.呵呵~~
xjw008 2003-08-21
  • 打赏
  • 举报
回复
xizi2002您的回答对我有一定的启发,但还是没有找到解决的办法!

比如:一个家庭肯定有祖宗十八代之多,如果按您的方法taxis这个字段那得多大呀!

再说aa也有可能是别人的儿子呀!

shuiaaa 2003-08-21
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2158/2158259.xml?temp=.8988306
xizi2002 2003-08-21
  • 打赏
  • 举报
回复
这样的话,表结构是最重要的
我记得有一个表结构是这样的
id
username //名子
index_id //是否在同一个家
taxis //级别
parent_id //父,没有为0
下面为例:
id username index_id taxis parent_id
1 aa 1 0000 0
2 bb1 1 0001 1
3 bb2 1 0002 1
4 bb3 1 0003 1
5 cc1 1 00010001 2
6 cc2 1 00010002 2
能看明白吗,这个是同一个家的由index_id决定,也就是taxis为0000的,
儿子是2,3,4第二个儿子的儿子是5,6
这样的话一条语句就可以了
select * from table where <条件> order by index_id, taxis





DFlyingchen 2003-08-21
  • 打赏
  • 举报
回复
用一门语言(比如PHP)编写一个递归调用的程序来操作数据库,虽然查询次数多一点,但是没有什么办法
xuzuning 2003-08-21
  • 打赏
  • 举报
回复
对mysql而言只能用php编程实现,一点都不慢
causky 2003-08-21
  • 打赏
  • 举报
回复
递归,PHP要慢的话用C/PERL
xuzuning 2003-08-21
  • 打赏
  • 举报
回复
做什么用的?如何会有那么多数据?

你可以考虑制作目录
xjw008 2003-08-21
  • 打赏
  • 举报
回复
不满您说,现在数据库中有10多万条记录,而且还在增长,遍历一遍速度可想而知!思考中...!
alexlee002 2003-08-21
  • 打赏
  • 举报
回复
是个难题阿,经典!!

21,886

社区成员

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

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