数据库表um_department:
CREATE TABLE `um_department` (
`deptid` int(11) NOT NULL AUTO_INCREMENT, //部门id
`dept` varchar(64) NOT NULL DEFAULT '', //部门名字
`dupid` int(11) DEFAULT '0', //上级部门id,dupid=0表示此部门为顶级部门
`deptshow` varchar(127) DEFAULT '', //部门信息
PRIMARY KEY (`deptid`)
) ENGINE=MyISAM AUTO_INCREMENT=74 DEFAULT CHARSET=gbk;
现在要查出整个部门树的结构,返回下面这样的数据
[{deptid:1, dept: '部门1', dupid:0, deptshow: '', deptlist: [{deptid:2, dept: '部门2', dupid:1, deptshow: ''}, {deptid:3, dept: '部门3', dupid:1, deptshow: ''}]}]
用的mysql数据查询模块是nodejs-mysql-native,我发现我写的时候还是同步的思维,不正确,代码如下:
var deptlist = [];
db.query("SELECT * from um_department where dupid='0'")
.on("row", function(r) {
r.deptlist = getDeptList(r.deptid);
deptlist.push(r);
})
.on("end", function(r) {
console.log(deptlist);
});
function getDeptList(deptid) {
var deptlist = [];
db.query("SELECT * from um_department where dupid = '" + deptid + "'")
.on("row", function(r) {
r.deptlist = getDeptList(r.deptid);
deptlist.push(r);
})
.on("end", function(r) {
return deptlist;
});
}
请问如何正确的实现这个功能啊
2 回复
当然不行拉,一定要用异步的思维。 将异步的函数嵌套在异步函数中,例如
db.select('xxxxxx').exec(function(err,doc){
//查询出最高级部门doc
db.select('根据doc查出其下子部门').exec(function(err,docs){
doc.list = docs;
console.dir(doc);
});
});
这只是一个简单的例子,不是用的mysql模块,大概意思就是让你嵌套。 另外你这个数据库设计和查询有2个你思考一下: 1.如果你的顶级部门很多怎么办,你这里只是查的一个 2.如果你的部门嵌套很深有多级怎么办,你这里只有两级 如果把这两种情况考虑进去,你再设计下你的查询看看