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
3 Réponses :
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
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?
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
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;
Vous aurez besoin de
GROUP BY,HAVINGetCOUNT (DISTINCT). Et, s'il vous plaît, utilisez la syntaxe expliciteJOIN.