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影响

使用MySQL SELECT查询获取父级的子级

Wordpress 3.5 - 如何仅使用 wp_nav_menu 显示父级的子菜单?

在 jQuery 中,如何设置元素的“top,left”属性,其位置值相对于父级而不是文档?

用position:fixed,相对于父级怎么定位?

绝对位置但相对于父级