sql >> Database >  >> RDS >> Mysql

mysql hoe het totale aantal onderliggende rijen te vinden met betrekking tot een bovenliggende?

Stel dat uw tafel is:

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)

Query is :

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;

De zoekopdracht zal een resultaat opleveren als:

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

[Antwoord ]:Dit voor Eén niveau (onmiddellijke supervisie) om alle supervisies te vinden op alle mogelijke niveaus die u moet gebruiken tijdens de lus (gebruik opgeslagen procedures).

Hoewel het mogelijk is om werknemers op elk niveau te achterhalen en vervolgens hun UNION te nemen, kunnen we in het algemeen geen zoekopdracht specificeren zoals "haal de supervisanten van een werknemer op alle niveaus" zonder gebruik te maken van een lusmechanisme. "

REFERENTIE :lees in deze dia slide nummer 23. Het BOEK is "FUNDAMENTALS OF Fourth Edition DATABASE SYSTEMS" in hoofdstuk "The Relational Algebra and Relational Calculus" is er een onderwerp "Recursieve sluitingsbewerkingen".

Query voor het maken van tabellen toevoegen, kan nuttig voor u zijn:

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)

U kunt Tabel als volgt controleren:

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. Hoe de tweede MAXIMUM DATUM te krijgen in MYSQL

  2. Transactiebeheer met Django 1.6

  3. mijn transactie wordt niet teruggedraaid als er iets misgaat in C# met mysql?

  4. Kan ik een atomaire toename in Rails 2.3 doen zonder terug te vallen op SQL?