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

[Отговор ]:Това за Едно ниво (незабавен надзор), за да намерите всички супервизи на всички възможни нива, които трябва да използвате while цикъл (използвайте съхранени процедури).

Въпреки че е възможно да извлечем служители на всяко ниво и след това да вземем техния СЪЮЗ, по принцип не можем да посочим заявка като „извличане на надзорните лица на служител на всички нива“, без да използваме механизъм за цикъл.> "

СПРАВКА :в този слайд прочетете слайд номер 23. КНИГАТА е „ОСНОВИ НА СИСТЕМИТЕ ЗА БАЗА ДАННИ от четвърто издание“ в глава „Релационна алгебра и релационно изчисление“ има тема „Операции за рекурсивно затваряне“.

Добавяне на заявка за създаване на таблица, може да ви бъде полезно:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java JDBC MySQL изключение:Операцията не е разрешена след затваряне на ResultSet

  2. Трябва ли да съхранявам цената като десетична или цяло число в Mysql?

  3. Как да закръглим времето до най-близкия отрязък от 15 минути

  4. Вмъкване на няколко реда със същия уникален идентификатор

  5. Как да копирате таблица от една таблица на отдалечен сървър в таблица на различен отдалечен db mysql5.6 с PDO