jfinal父子孙儿查询

数据库结构

id     name    pid  level
1     曾祖父     0     1
2     祖父        1     2
3     父亲        2     3
4     儿子        3     4
5     女儿        3     4


MYSQL 查询语句

select *
from tb as t1
   left join tb as t2 on t2.pid=t1.id and t2.pid=1
   left join tb as t3 on t3.pid=t2.id and t3.pid=2
   left join tb as t4 on t4.pid=t3.id and t4.pid=3
where t1.pid=0;

用这个语句,mysql会有两条数据。

获取方式

List<Class> list=dao.find("这里是上面的mysql查询语句");


这个list只会得到儿子和女儿的信息,怎么得到上面的信息,如曾祖父、祖父、父亲

评论区

楚康生

2016-07-08 11:31

更改表结构,增加 path 字段 ,如:女儿的path为,1,2,3, ;如果要查曾祖父一家所有人,则where条件中直接path like '%,1,%'即可。

多重人格的疯子

2016-07-08 11:32

你这个sql有问题吧。。如果你的女儿下边还有儿子或者孙子,那你的sql是不是又得改,而且这个树如果增加一个节点,那你的sql就要改一次。

tosur

2016-07-08 11:54

@多重人格的疯子 是的,没好办法

tosur

2016-07-08 11:54

@楚康生 有没更好的办法

多重人格的疯子

2016-07-08 12:55

@tosur 办法有很多,看你怎么选择,mysql不像oracle有自己的函数,mysql上下级查询你可以用临时表和递归过程或者中间表都可以,也可以写个递归查询的代码来搞定,只是递归查询层级太多比较坑爹。

javalpha

2016-07-08 15:40

10多年前的一个产品(文章)无限级分类表设计。不能贴图?

javalpha

2016-07-08 16:15

id,parentid,title,childid,allparentpath(数据如0,88……)

tosur

2016-07-08 16:51

@javalpha 回复貌似不能贴图

海哥

2016-07-09 10:06

如果是文章分类之类的,数据量不多,可以先全部查询,然后在用java来排序,可以参考JPress的实现。

JFinal

2016-07-09 12:10

@javalpha 目前还不支持回复贴图功能,后续会考虑添加,看需求的强烈程度 ^_^

badouyuren

2016-07-12 18:42

@JFinal 强烈需求贴图啊

JFinal

2016-07-12 19:00

@badouyuren 还有些必要的功能正在开发中,逐步完善,多多关注社区动态

JJfinal

2016-07-23 13:14

拿到上一级id,直接查询pid=id就行了呀,比如查询父亲下面的节点:where pid = 3就可以啦 level字段只要记录当前结点是否为叶子节点就可以了