sql >> Database teknologi >  >> RDS >> Mysql

mysql hvordan man finder det samlede antal underordnede rækker med hensyn til en forælder

Antag, at dit bord er:

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)
 

Forespørgsel er :

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;
 

Forespørgslen vil producere resultat som:

+------------+------------+----------+ | 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)

[Svar ]:Dette for ét niveau (øjeblikkelig overvågning) for at finde alle overvågninger på alle mulige niveauer, du skal bruge mens loop (brug lagrede procedurer).

Selvom det er muligt at hente medarbejdere på hvert niveau og derefter tage deres UNION, kan vi generelt ikke specificere en forespørgsel såsom "hente de superviserede af en medarbejder på alle niveauer" uden at bruge en looping-mekanisme.> "

REFERENCE :i dette slide læs slide nummer 23. BOGEN er " FUNDAMENTALS OF FourthEdition DATABASE SYSTEMS" i kapitlet "The Relational Algebra and Relational Calculus" er der et emne "Recursive Closure Operations".

Tilføjelse af forespørgsel til tabeloprettelse, kan være nyttigt for dig:

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)
 

Du kan kontrollere tabel som:

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-fejl For mange forbindelser

  2. Hvordan opretter du forberedte udsagn med mysql2-perlen?

  3. Få en liste over datoer mellem to datoer ved hjælp af en funktion

  4. En bærbar måde at give en IP-baseret nedkølingsperiode?