mysql如何找到相对于父级的子行总数
Posted
技术标签:
【中文标题】mysql如何找到相对于父级的子行总数【英文标题】:mysql how to find the total number of child rows with respect to a parent 【发布时间】:2012-12-06 05:56:49 【问题描述】:我有一张这样的父子关系表,
Employee_ID | Employee_Manager_ID | Employee_Name
--------------------------------------------------------
1 | 1 | AAAA
2 | 1 | BBBB
3 | 2 | CCCC
4 | 3 | DDDD
5 | 3 | EEEEE
是否可以使用单个查询来获取特定员工下的所有员工的数量(不仅是直接孩子,还有孩子的所有孩子的数量)?
Eg if the input = 1
output should be 4
if input = 2 ,output should be 3
提前致谢
【问题讨论】:
我觉得是sql递归问题,参考这个Q***.com/questions/59544/sql-recursion 阅读这篇文章。这在这种情况下非常有用explainextended.com/2009/07/20/… 【参考方案1】:假设您的表是:
mysql> SELECT * FROM Employee;
+-----+------+-------------+------+
| SSN | Name | Designation | MSSN |
+-----+------+-------------+------+
| 1 | A | OWNER | 1 |
| 10 | G | WORKER | 5 |
| 11 | D | WORKER | 5 |
| 12 | E | WORKER | 5 |
| 2 | B | BOSS | 1 |
| 3 | F | BOSS | 1 |
| 4 | C | BOSS | 2 |
| 5 | H | BOSS | 2 |
| 6 | L | WORKER | 2 |
| 7 | I | BOSS | 2 |
| 8 | K | WORKER | 3 |
| 9 | J | WORKER | 7 |
+-----+------+-------------+------+
12 rows in set (0.00 sec)
查询是:
SELECT SUPERVISOR.name AS SuperVisor,
GROUP_CONCAT(SUPERVISEE.name ORDER BY SUPERVISEE.name ) AS SuperVisee,
COUNT(*)
FROM Employee AS SUPERVISOR
INNER JOIN Employee SUPERVISEE ON SUPERVISOR.SSN = SUPERVISEE.MSSN
GROUP BY SuperVisor;
查询将产生如下结果:
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| A | A,B,F | 3 |
| B | C,H,I,L | 4 |
| F | K | 1 |
| H | D,E,G | 3 |
| I | J | 1 |
+------------+------------+----------+
5 rows in set (0.00 sec)
[回答]: 这对于一个级别(立即监督)查找所有可能级别的所有监督,您必须使用 while 循环(使用存储过程)。
虽然可以检索每个级别的员工,然后获取他们的 UNION,但通常我们不能在不使用循环机制的情况下指定诸如“检索所有级别的员工的受监督者”之类的查询。 ”
REFERENCE:在这张幻灯片中阅读第 23 号幻灯片。 本书为《Fundamentals OF FourthEdition DATABASE SYSTEMS》,在“关系代数和关系演算”一章中有一个主题“递归闭包运算”。
为创建表添加查询,可能对您有帮助:
mysql> CREATE TABLE IF NOT EXISTS `Employee` (
-> `SSN` varchar(64) NOT NULL,
-> `Name` varchar(64) DEFAULT NULL,
-> `Designation` varchar(128) NOT NULL,
-> `MSSN` varchar(64) NOT NULL,
-> PRIMARY KEY (`SSN`),
-> CONSTRAINT `FK_Manager_Employee` FOREIGN KEY (`MSSN`) REFERENCES Employee(SSN)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.17 sec)
你可以像这样检查表格:
mysql> DESCRIBE Employee;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| SSN | varchar(64) | NO | PRI | NULL | |
| Name | varchar(64) | YES | | NULL | |
| Designation | varchar(128) | NO | | NULL | |
| MSSN | varchar(64) | NO | MUL | NULL | |
+-------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
【讨论】:
感谢您的回答。但我期待所有员工都在他之下的结果。不仅是直接孩子,他们孩子的所有孩子。(如果我给公司 owmers id ,我需要得到所有员工的数量,如果它映射正确)是有可能吗? @user1869132 :抱歉,如果没有循环机制,我们无法做到这一点...阅读更新的答案。【参考方案2】:你可以试试这个:
SELECT
table_name.Employee_ID,
table_name.Employee_Name,
COUNT(*) AS children
FROM
table_name AS t_one
INNER JOIN table_name AS t_two ON
t_two.Employee_Manager_ID=t_one.Employee_ID
GROUP BY
t_one.Employee_ID
【讨论】:
以上是关于mysql如何找到相对于父级的子行总数的主要内容,如果未能解决你的问题,请参考以下文章
css如何让子元素不受父级的父级的overflow:hidden影响
Wordpress 3.5 - 如何仅使用 wp_nav_menu 显示父级的子菜单?