MySQL: utilisation incorrecte de la fonction de groupe

J’utilise MySQL. Voici mon schéma:

Fournisseurs ( sid: integer , sname: chaîne, chaîne d’adresse)

Parts ( pid: integer , pname: ssortingng, couleur: ssortingng)

Catalogue ( sid: integer, pid: integer , cost: real)

(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’y vais même de la bonne façon?

Deuxièmement, je reçois cette erreur:

1111 – Utilisation invalide de la fonction de groupe

Qu’est-ce que je fais mal?

Vous devez utiliser HAVING, pas WHERE.

La différence est la suivante: la clause WHERE filtre les lignes sélectionnées par MySQL. Ensuite, MySQL regroupe les lignes et agrège les numéros de votre fonction COUNT.

HAVING est comme WHERE, seulement cela se produit après que la valeur COUNT a été calculée, donc cela fonctionnera comme prévu. Réécrivez votre sous-requête en tant que:

 ( -- where that pid is in the set: SELECT c2.pid -- of pids FROM Catalog AS c2 -- from catalog WHERE c2.pid = c1.pid HAVING COUNT(c2.sid) >= 2) 

Tout d’abord, l’erreur que vous obtenez est due à l’endroit où vous utilisez la fonction COUNT – vous ne pouvez pas utiliser une fonction d’agrégat (ou de groupe) dans la clause WHERE .

Deuxièmement, au lieu d’utiliser une sous-requête, joignez simplement la table à elle-même:

 SELECT a.pid FROM Catalog as a LEFT JOIN Catalog as b USING( pid ) WHERE a.sid != b.sid GROUP BY a.pid 

Ce qui, je crois, ne devrait renvoyer que des lignes contenant au moins deux lignes avec le même pid mais il y a au moins 2 sid s. Pour être sûr de ne récupérer qu’une seule ligne par pid j’ai appliqué une clause de regroupement.