sql >> データベース >  >> RDS >> Mysql

mysql親に関する子行の総数を見つける方法

    テーブルが次のようになっているとします:

    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)
    

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

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

    参照 :このスライドでは、スライド番号23を読んでください。本は「関係代数と関係論理」の章の「FourthEditionデータベースシステムの基礎」であり、トピック「再帰的クロージャー操作」があります。

    テーブル作成用のクエリを追加すると、役立つ場合があります:

    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)  
    


    1. MySQL AまたはB、ただし両方ではない

    2. セッションとセッションデータの保存に適したMySQLデータベースエンジンは、MyISAMとInnoDBのどちらですか?

    3. クエリ、ストアドプロシージャ、およびトリガー用のSQLServerパフォーマンスインジケーターの実装

    4. intをvarcharにキャストします