1
votes

Comment afficher les entrées dans Table_1 qui ont exactement n entrées dans Table_2?

Je ne suis donc pas tout à fait sûr de savoir comment poser cette question de manière générale, je vais donc simplement demander comment elle m'a été présentée. Les deux tableaux pertinents sont:

select M.Name, M.Email
from Manager M, ManagerCertificate MC
??? where MC.ManagerID = M.ID    ???

Affiche les noms et les courriels de chaque gestionnaire qui a exactement 3 certificats distincts.

J'ai essayé plusieurs choses mais j'échoue sans cesse. Dois-je utiliser une sous-requête imbriquée, un opérateur de comptage peut-être ...

Manager (
    ID: integer, 
    LoginID: varchar(16), 
    Name: varchar(64), 
    Password: varchar(8), 
    Birthday: date, 
    Address: varchar(128), 
    Email: varchar(32), 
    PhoneNumber: char(10)
)  

ManagerCertificate (
    ManagerID: integer, -- Foreign key: ManagerID references Manager(ID) 
    CertificateId: integer, 
    Certificate: blob
)

Je cherche à être pointé dans la bonne direction. Je complique peut-être trop les choses.

Merci


1 commentaires

Vous aurez besoin de GROUP BY , HAVING et COUNT (DISTINCT) . Et, s'il vous plaît, utilisez la syntaxe explicite JOIN .


3 Réponses :


1
votes

Je peux vous donner une réponse dans Oracle SQL que vous pourrez probablement traduire.

Select m.manager_id, m.manager_name  
from managers m, 
(select manager_id, count(*)
from certificates
group by manager_id
having count = 3) c
where m.manager_id = c.manager_id


3 commentaires

Vous voudrez probablement un COUNT (DISTINCT ...) ici juste au cas où un gestionnaire aurait reçu le même CertificateID plusieurs fois. OP n'a pas spécifié, il n'est donc pas sûr de supposer que le CertificateID est unique.


belle pensée - j'imaginais qu'il s'agissait de certifications de gestion d'une sorte, de sorte que les doublons ne se produiraient pas. Cependant, j'apprécie votre contribution.


Comment les réponses qui utilisent la syntaxe archaïque JOIN obtiennent-elles un vote favorable?



2
votes

Un JOIN avec COUNT est un moyen de le faire, en regroupant sur le nom et l'adresse e-mail du responsable et en vérifiant (en utilisant HAVING ) que le manager a exactement 3 certificats distincts. Notez que MySQL JOIN (avec une clause ON ) est préférée aux jointures par virgule à l'ancienne.

SELECT M.Name, M.Email
FROM Manager M
JOIN ManagerCertificate MC ON MC.ManagerID = M.ID
GROUP BY M.Name, M.Email
HAVING COUNT(DISTINCT MC.CertificateId) = 3


0 commentaires

1
votes

J'aime utiliser une sous-requête et COUNT (DISTINCT) ici.

SELECT 
    M.Name
    , M.Email
FROM Manager M
INNER JOIN ( 
            SELECT ManagerID 
            FROM ManagerCertificate MC 
            GROUP BY ManagerID 
            HAVING COUNT(DISTINCT CertificateId) = 3 
            ) C 
    ON M.ManagerID = C.ManagerID;


0 commentaires