所以我有一个拥有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。)
答案 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