选择所有子记录但需要父记录或祖父记录的值

时间:2013-05-28 14:44:25

标签: sql mariadb

我正在开发一个项目,该项目使用MariaDB v5.5数据库来跟踪基于树的高层次员工。该树中的每个人都可以拥有与之相关的各种“标志”。在这种情况下,这些标志使用位掩码存储。

我的对象如下所示

Employee Table description
+--------------+-------------+--------------------------------------+
| Name         | Field       | Description                          |
+--------------+-------------+--------------------------------------+
| employee_id  | INT         | Unique key                           |
| name         | VARCHAR(45) | Employees name                       |
| flags        | INT(4)      | Bitmask of employee attributes       |
| parent_id    | INT         | the employee_id of the parent record |
+--------------+-------------+--------------------------------------+

'flag' bitmap description
+-----+--------------+
| Bit | Flag         |
+-----+--------------+
| 0   | CEO          |
| 1   | MANAGER      |
| 2   | PROJECT_LEAD |
| 3   | SALES_PERSON |
| 4   | MAINTANCE    |
+-----+--------------+

Employee Table Data
+----+--------+------------+---------------------------+
| id | name   | parent_id  | flags                     |
+----+--------+------------+---------------------------+
| 1  | Lisa   | NULL       | CEO                       | 
| 2  | Steve  | 1          | MANAGER                   | 
| 3  | Pat    | 1          | MANAGER                   | 
| 4  | Mary   | 2          | SALES_PERSON,PROJECT_LEAD | 
| 5  | Phil   | 4          | SALES_PERSON,MAINTANCE    |
| 6  | Jim    | 3          | SALES_PERSON,MAINTANCE    |
| 7  | Anna   | 3          | SALES_PERSON,MAINTANCE    |
+----+--------+------------+---------------------------+

假设我想查询具有“MAINTANCE”标志的所有员工但是我需要返回具有“MANAGER”标志的父记录的id。所以我的结果应该是这样的。

> SELECT id, name, manager_id, manager_name FROM ...
+----+--------+------------+--------------+
| ID | Name   | manager_id | manager_name |
+----+--------+------------+--------------+
| 5  | Phil   | 2          | Steve        |
| 6  | Jim    | 3          | Pat          |
| 7  | Anna   | 3          | Pat          |
+----+--------+------------+--------------+

那么如何构建我的查询以给我我想要的东西?

请注意,此树可能只有3个级别,查询仍需要工作。

1 个答案:

答案 0 :(得分:0)

Select
 a.ID
,a.Name
,a.manager_ID
,b.Manager_Name
From
 EmployeeTable As a
Left Join
 EmployeeTable As b
On
 a.Mangager_ID = b.ID
Where
 a.Flag = 'Maintenance'
And
 b.Flag = 'Manager'

这可以为您提供所需的信息。