Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql jak znaleźć całkowitą liczbę wierszy potomnych w odniesieniu do rodzica

Załóżmy, że Twój stół to:

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)

Zapytanie to :

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;

Zapytanie da wynik taki jak:

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

[Odpowiedź ]:Ten dla jednego poziomu (nadzor natychmiastowy), aby znaleźć wszystkich superwizorów na wszystkich możliwych poziomach, których musisz użyć w pętli while (użyj procedur składowanych).

Chociaż możliwe jest wyszukanie pracowników na każdym poziomie, a następnie wzięcie ich UNION, ogólnie nie możemy określić zapytania, takiego jak „pozyskanie superwizorów pracownika na wszystkich poziomach” bez użycia mechanizmu pętli.

ODNOŚNIK :na tym slajdzie przeczytasz slajd numer 23. KSIĄŻKA to " PODSTAWY SYSTEMÓW BAZY DANYCH FourthEdition" w rozdziale "Algebra Relacji i Rachunek Relacji" znajduje się temat "Operacje Rekursywnego Zamknięcia".

Dodanie zapytania do tworzenia tabeli może być dla Ciebie pomocne:

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)

Możesz sprawdzić tabelę w następujący sposób:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ZNACZNIK CZASOWY oznacza?

  2. Błąd składni Mysql podczas tworzenia procedury składowanej

  3. Wstawianie elementu w słuchacza doktryny

  4. PHP zamienia przecinek w <br />

  5. Pobierz rekordy za pomocą zapytania JOIN