Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql, wie man die Gesamtzahl der untergeordneten Zeilen in Bezug auf ein übergeordnetes Element ermittelt

Angenommen, Ihre Tabelle ist:

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)

Abfrage ist :

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;

Die Abfrage erzeugt ein Ergebnis wie:

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

[Antwort ]:Dies für eine Ebene (sofortige Überwachung), um alle Überwachungen auf allen möglichen Ebenen zu finden, müssen Sie die While-Schleife verwenden (gespeicherte Prozeduren verwenden).

Obwohl es möglich ist, Mitarbeiter auf jeder Ebene abzurufen und dann ihre UNION zu nehmen, können wir im Allgemeinen keine Abfrage wie „Abrufen der Vorgesetzten eines Mitarbeiters auf allen Ebenen“ ohne Verwendung eines Schleifenmechanismus angeben. "

REFERENZ :Lesen Sie auf dieser Folie Folie Nr. 23. Das BUCH ist "GRUNDLAGEN VON DATENBANKSYSTEMEN DER VIERTEN AUSGABE" im Kapitel "Relationale Algebra und relationales Kalkül" gibt es ein Thema "Rekursive Abschlussoperationen".

Das Hinzufügen einer Abfrage für die Tabellenerstellung kann für Sie hilfreich sein:

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)

Sie können die Tabelle wie folgt überprüfen:

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)