如何选择基于它的表格列

时间:2016-08-09 09:42:15

标签: mysql postgresql

我有一张这样的表

+-------------+---------------+-----------+
| employee_id | employee_name | upline_id |
+-------------+---------------+-----------+
| 1           | Andin         | 0         |
+-------------+---------------+-----------+
| 2           | Budi          | 1         |
+-------------+---------------+-----------+
| 3           | Citra         | 2         |
+-------------+---------------+-----------+
| 4           | Doni          | 2         |
+-------------+---------------+-----------+
| 5           | Erik          | 3         |
+-------------+---------------+-----------+
| 6           | Gana          | 4         |
+-------------+---------------+-----------+

然后,如果我选择employee_id为2的位置,它还会显示像这样的数据

+-------------+---------------+-----------+
| employee_id | employee_name | upline_id |
+-------------+---------------+-----------+
| 2           | Budi          | 1         |
+-------------+---------------+-----------+
| 3           | Citra         | 2         |
+-------------+---------------+-----------+
| 4           | Doni          | 2         |
+-------------+---------------+-----------+
| 5           | Erik          | 3         |
+-------------+---------------+-----------+
| 6           | Gana          | 4         |
+-------------+---------------+-----------+

因为在employee_id 2中有upline_id 2的孩子,那么仍然有上线的孩子正在循环,直到最后一个没有upline_id的人与employee_id相同。 希望你理解,对不起我的英语非常糟糕。

如果我选择employee_id是3 数据显示如下

+-------------+---------------+-----------+
| employee_id | employee_name | upline_id |
+-------------+---------------+-----------+
| 3           | Citra         | 2         |
+-------------+---------------+-----------+
| 5           | Erik          | 3         |
+-------------+---------------+-----------+

我真的不知道我在问什么,呵呵

postgre或mysql

1 个答案:

答案 0 :(得分:0)

您用于存储分层数据的模型称为" 邻接列表"。

遗憾的是,MySQL不支持递归函数,因此使用这样的模型就必须为人们希望遍历的层次结构的每个级别进行自联接 - 但应该很明显,这不是&#39 ; ta非常可扩展的解决方案。

另一方面,PostgreSQL支持递归CTEs,你可以用它来做:

WITH RECURSIVE tree AS (
  SELECT id, name, ARRAY[]::INTEGER[] AS ancestors
  FROM   employees
  WHERE  upline_id = 0

  UNION ALL

  SELECT employees.id, employees.name, tree.ancestors || employees.upline_id
  FROM   employees JOIN tree ON employees.upline_id = tree.id
) SELECT * FROM tree WHERE 2 = ANY(tree.ancestors)

但是,对于大型图表来说,这可能效率很低。

更好的建议是使用" 嵌套集"来重新构建数据。或者" 传递闭包的表"你的图表。 @Bill Karwin的演示文稿,Models for Hierarchical Data in SQL and PHP是对各种方法的出色解释/比较。