J'utilise MySQL. Voici mon schéma:
Fournisseurs ( sid: entier , sname: chaîne, chaîne d'adresse)
Parts ( pid: integer , pname: string, color: string)
Catalogue ( sid: entier, pid: entier , coût: réel)
(les clés primaires sont en gras)
J'essaie d'écrire une requête pour sélectionner toutes les pièces fabriquées par au moins deux fournisseurs:
-- Find the pids of parts supplied by at least two different suppliers.
SELECT c1.pid -- select the pid
FROM Catalog AS c1 -- from the Catalog table
WHERE c1.pid IN ( -- where that pid is in the set:
SELECT c2.pid -- of pids
FROM Catalog AS c2 -- from catalog
WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids
);
Tout d'abord, est-ce que j'agis de la bonne manière?
Deuxièmement, j'obtiens cette erreur:
1111 - Utilisation incorrecte de la fonction de groupe
Qu'est-ce que je fais mal?
la source
Premièrement, l'erreur que vous obtenez est due à l'endroit où vous utilisez la
COUNT
fonction - vous ne pouvez pas utiliser une fonction d'agrégation (ou de groupe) dans laWHERE
clause.Deuxièmement, au lieu d'utiliser une sous-requête, joignez simplement la table à elle-même:
Ce qui, je crois, ne devrait renvoyer que les lignes où au moins deux lignes existent avec le même
pid
mais il y a au moins 2sid
s. Pour vous assurer de ne récupérer qu'une seule ligne par,pid
j'ai appliqué une clause de regroupement.la source
COUNT(DISTINCT sid)
dans votre requête mise à jour.sid
toujours besoin d'être distinct de toute façon, carsid
etpid
forment ensemble une clé primaire pourCatalog
?