【发布时间】:2019-11-14 08:25:25
【问题描述】:
我得到了一个如下所示的员工表:
用于创建示例输入的查询。
CREATE TABLE employee(
empId INTEGER,
empName VARCHAR(20),
mgrId INTEGER,
salary DECIMAL(12,2)
);
INSERT INTO employee VALUES
(1, 'A', 2, 100),
(2, 'B', 4, 150),
(3, 'C', 4, 165),
(4, 'D', 7, 200),
(5, 'E', 6, 210),
(6, 'F', 7, 250),
(7, 'G', 7, 300),
(8, 'H', 6, 170);
链接到 SQL Fiddle:http://sqlfiddle.com/#!9/cd4be8
此示例数据导致此层次结构。
每个员工都有一个直接上司。此外,所有比给定员工高级的员工都被称为他们的间接老板。 在给定的样本中,A 的直接老板是 B,C、D、E、F、G 和 H 是 A 的间接老板。我需要找到两件事。
- 对于每个员工,找出比该员工高的所有员工的数量(直接上司人数 + 间接上司人数)。
预期输出:
+---------+-------+
| empName | total |
+---------+-------+
| A | 7 |
| B | 3 |
| C | 3 |
| D | 1 |
| E | 3 |
| F | 1 |
| G | 0 |
| H | 3 |
+---------+-------+
- 对于每个员工,找到间接老板的方式是间接老板的工资至少是给定员工工资的两倍,但在间接老板中最低。
预期输出:
+---------+------+
| empName | mgr |
+---------+------+
| A | D |
| B | G |
| C | NULL |
| D | NULL |
| E | NULL |
| F | NULL |
| G | NULL |
| H | NULL |
+---------+------+
解释:对于员工 A(工资 = 100),至少双倍工资的间接老板是 D(工资 = 200)、F(工资 = 210)和 G(工资 = 300)。但由于 D 的工资是 D、F 和 G 最低的,所以结果是 D。
很容易找到员工的下属人数,但反过来却非常棘手。任何帮助/提示将不胜感激。
【问题讨论】:
-
找老板的数量和找员工下属的数量一样简单,如果你已经有这个,请分享一下,我们可以告诉你要切换哪两个别名反转方向。如果您需要灵感(也就是基本上所有方法的列表),请参阅How to create a MySQL hierarchical recursive query
-
你使用的是哪个版本的 MySQL - 这在 8+ 中大大简化了
-
@Strawberry,我在一次采访中被问到这个问题。目前,我在 MySQL V 5.6 上进行了尝试,但您也可以在 V 8+ 中解释相同的内容,因为我了解自此版本起引入了 Windowing/Analytical 功能(以及其他功能)。我所能尝试的就是这个,然后我被卡住了 - sqlfiddle.com/#!9/cd4be8/13
-
@Solarflare,看起来
CTE是关键。感谢您的提醒。 -
您可以通过使用闭包表在不使用 CTE 的情况下解决此问题 - 如 stackoverflow.com/a/38701519/5962802 中所述,该代码适用于 PostgreSQL,但对于 MySQL 修改它并不难。闭包表占用磁盘空间但允许更简单的查询 - 仅查找直接祖先/后代、所有可能的后代、直到根的所有祖先、所有兄弟姐妹等。