1

こんな親子関係のテーブルがありますが、

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

前もって感謝します

4

2 に答える 2

2

テーブルが次のとおりであるとします。

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)

[回答]: この for One レベル (即時監視) は、while ループ (ストアド プロシージャを使用) を使用する必要があるすべての可能なレベルですべての監視を検索します。

各レベルの従業員を取得してその UNION を取得することは可能ですが、通常、ループ メカニズムを利用せずに「すべてのレベルの従業員の監督者を取得する」などのクエリを指定することはできません。"

参照: このスライドでは、スライド番号 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)  
于 2012-12-06T06:11:22.903 に答える
0

あなたはこれを試すことができます:

    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
于 2012-12-06T06:28:07.363 に答える