如何实现查询结果的树排序?很头疼的一个问题。

forai 发布于 2015/05/25 16:19
阅读 1K+
收藏 4

现有的数据结构如图 

1、组织机构表 ID,NAME,PID,SORT_ORDER


2、用户表 ID,NAME,DEPTID,SORT_ORDER

3、现有数据显示的树状结构如图:

如果是用tree的js组件,这个树很好实现。

现在,我想做一个通讯录功能,查询员工列表,按照机构顺序(包括下级机构)。

查询出来的员工列表的顺序应该和树里面的从上到下的员工顺序一样。

这个要怎么样写代码(Java或者sql)能够实现。

用js的tree组件实现机构树和人员很简单。但是我要用sql查询出来单纯的列表。不知道怎么实现了。

请各位帮忙。

加载中
0
霍啸林
霍啸林
import contact.Dept;
import contact.Emp;
import contact.EmpComparator;

import java.util.*;

public class Program {
    private static Map<Integer, Dept> deptMap;
    private static Map<Integer, Emp>  empMap;

    private static void init() {
        Dept newDept = null;
        Emp  newEmp  = null;

        deptMap = new HashMap<>();
        empMap  = new HashMap<>();

        newDept = new Dept(1, "公司",   0, 99); deptMap.put(newDept.Id, newDept);
        newDept = new Dept(2, "技术部", 1, 90); deptMap.put(newDept.Id, newDept);
        newDept = new Dept(3, "市场部", 1, 80); deptMap.put(newDept.Id, newDept);
        newDept = new Dept(4, "测试组", 2, 90); deptMap.put(newDept.Id, newDept);
        newDept = new Dept(5, "研发组", 2, 95); deptMap.put(newDept.Id, newDept);

        newEmp = new Emp(1,  "老板",         1, 99); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(2,  "技术部经理",   2, 90); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(3,  "技术部副经理", 2, 89); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(4,  "市场部经理",   3, 90); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(5,  "测试组长",     4, 90); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(6,  "研发组长",     5, 90); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(7,  "测试组员1",    4, 80); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(8,  "测试组员2",    4, 50); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(9,  "研发组员1",    5, 80); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(10, "研发组员2",    5, 70); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(11, "秘书",         1, 90); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(12, "市场专员1",    3, 50); empMap.put(newEmp.Id, newEmp);
        newEmp = new Emp(13, "市场专员2",    3, 50); empMap.put(newEmp.Id, newEmp);
    }

    private static List<Emp> getContacts() {
        List<Emp> result = new ArrayList<>(empMap.values());
        Collections.sort(result, new EmpComparator(deptMap));
        return result;
    }

    public static void main(String[] args) {
        init();

        for (Emp emp : getContacts()) {
            System.out.println(emp);
        }
    }
}



0
霍啸林
霍啸林
个人感觉用 Java 实现容易些
eechen
eechen
PHP的话个人感觉也是读出来后用关联数组存储并输出树形结构.
0
飘逸的逸
飘逸的逸

SQL实现的话,可以把sort_order调整一下,例如老板9999,再小的类数量级递减,然后根据sort_order排序。 如果不行可以增加两个字段控制,group_sort_id, role_sort_id... 

感觉用Java实现没啥必要,以后改起来麻烦。

0
forai
forai

引用来自“rebelman”的评论

SQL实现的话,可以把sort_order调整一下,例如老板9999,再小的类数量级递减,然后根据sort_order排序。 如果不行可以增加两个字段控制,group_sort_id, role_sort_id... 

感觉用Java实现没啥必要,以后改起来麻烦。

group_sort_id, role_sort_id 也不行吧。因为这里技术部经理和市场部经理都是同级别的。但是研发组的又要排在市场部经理的前面。这里用role或者group都排不了啊。

如果是用sort_order,就要把sort_order作为全局的排序号了。这里的初衷是sort_order是作为同级别的排序号存在的。

0
0
梅开源
梅开源

先查机构列表,生成一个向量(Vector)

然后向量里的元素为一个Vector(机构代码为x的员工,按某顺序)排列,就是Vector套Vector

--------------------------------------------------------------------------------

这问题其实不算个树,多数树结构相关操作都不用的


0
forai
forai

引用来自“梅开源”的评论

先查机构列表,生成一个向量(Vector)

然后向量里的元素为一个Vector(机构代码为x的员工,按某顺序)排列,就是Vector套Vector

--------------------------------------------------------------------------------

这问题其实不算个树,多数树结构相关操作都不用的


兄弟,能再细一点么。这么说我不大明白具体的思路。

你说的向量,我遇到3层的时候又要怎么算?

梅开源
梅开源
回复 @forai : 先这样实现。如果卡的话再想办法优化瓶颈。我觉得就这点大查询量怎样都不慢。
forai
forai
回复 @梅开源 : 那就是先查询最上层,然后查询他的下级,再下级,直到没有,最后再查他的同级别的,以此类推? 这样的话,会用到N次查询了。
forai
forai
回复 @梅开源 : 这种如何让测试组的人员的排序级别高于市场经理,低于技术部经理。。。
梅开源
梅开源
就是分层查,每次查出一组数据用个向量装着。当然要用个大点数组也一样可以。
0
谁的天下
谁的天下

光看你给的两张表,数据信息不全。

测试组和研发组隶属于技术部,这个条件在数据里没体现出来。

个人理解,应该表中加个新数据项,以体现出来部门之间的隶属关系。

霍啸林
霍啸林
组织机构表 PID
0
霍啸林
霍啸林
package contact;

public class Emp {
    public Integer Id;
    public String  Name;
    public Integer DeptId;
    public Integer SortOrder;

    public Emp(int id, String name, int deptId, int sortOrder) {
        this.Id        = id;
        this.Name      = name;
        this.DeptId    = deptId;
        this.SortOrder = sortOrder;
    }

    public int compareToSibling(Emp emp) {
        if (this.SortOrder.equals(emp.SortOrder)) {
            return this.Id.compareTo(emp.Id);
        }
        return -this.SortOrder.compareTo(emp.SortOrder);
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof Emp) {
            return this.Id.equals(((Emp)o).Id);
        }
        return super.equals(o);
    }

    @Override
    public String toString() {
        return this.Name;
    }
}



0
霍啸林
霍啸林
package contact;

public class Dept {
    public Integer Id;
    public String  Name;
    public Integer Pid;
    public Integer SortOrder;
    public Dept ParentDept;

    public Dept(int id, String name, int pid, int sortOrder) {
        this.Id         = id;
        this.Name       = name;
        this.Pid        = pid;
        this.SortOrder  = sortOrder;
        this.ParentDept = null;
    }

    public int compareToSibling(Dept dept) {
        if (this.SortOrder.equals(dept.SortOrder)) {
            return this.Id.compareTo(dept.Id);
        }
        return -this.SortOrder.compareTo(dept.SortOrder);
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof Dept) {
            return this.Id.equals(((Dept)o).Id);
        }
        return super.equals(o);
    }

    @Override
    public String toString() {
        return this.Name;
    }
}



返回顶部
顶部