如何在mysql中找到经理级别?

时间:2015-05-13 17:50:06

标签: mysql view

所以我有一个拥有10万名员工的巨大桌子。除了我们的顶级老板外,每位员工都有一位主管。

我想从底部捕捉经理人的等级。听起来很简单,但现在我在每个级别创建了一系列视图 - 9次。

实施例

SELECT DISTINCT
reports__allmanagers.supervisorid
FROM
reports__allmanagers 


SELECT
ldap_large.uid,
ldap_large.mail,
ldap_large.jobcode,
ldap_large.thomsjobcodedescr,
ldap_large.supemail,
ldap_large.thomssupervisorid, 
CASE
        WHEN uid LIKE '9999' THEN '9999'
                ELSE '2'
      END as man_level
FROM
reports_man2ids
INNER JOIN ldap_large ON reports__man2ids.supervisorid = ldap_large.uid 

这只是第2级的两个视图。最后,我通过查询组合了视图,并形成了一个静态日常表。它的工作原理但非常低效。有更简单的方法吗?

(我这样做的另一个问题是我们的公司不是完美的树。所以在我看来,一些主管潜入2-3个不同的层次。最后我需要只有一个每个主管的排。所以很明显,上层管理将是第一级的第一个视图,所以我们只是丢弃较低的man_levels。​​)

1 个答案:

答案 0 :(得分:0)

您将需要创建一个递归查询,该查询将一直运行,直到我到达顶级boss。保持某种反击,以了解您目前的水平。根据您提供的信息,我不太确定模式究竟是什么,但这个问题对于编写递归查询有很多很好的答案:How to create a MySQL hierarchical recursive query

取自其中一个答案:

表格结构

+-------------+----------------------+--------+
| category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |
+-------------+----------------------+--------+

查询:

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

输出

+-------------+----------------------+--------------+-------+
| lev1        | lev2                 | lev3         | lev4  |
+-------------+----------------------+--------------+-------+
| ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |
| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |
| ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |
| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |
| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |
+-------------+----------------------+--------------+-------+

大多数用户曾经在SQL数据库中处理过分层数据,毫无疑问,他们了解到分层数据的管理不是关系数据库的用途。关系数据库的表不是分层的(如XML),而只是一个平面列表。分层数据具有父子关系,该关系不是在关系数据库表中自然表示的。阅读更多

请参阅博客了解更多详情。

编辑:

select @pv:=category_id as category_id, name, parent from category
join
(select @pv:=19)tmp
where parent=@pv

输出:

category_id name    parent
19  category1   0
20  category2   19
21  category3   20
22  category4   21