Frage MySQL: Ungültige Verwendung der Gruppenfunktion


Ich benutze MySQL. Hier ist mein Schema:

Lieferanten(Sid: Ganzzahl, sname: String, Adress-String)

Teile(PID: Ganzzahl, pname: string, Farbe: string)

Katalog(SID: Ganzzahl, PID: Ganzzahl, Kosten: real)

(Primärschlüssel sind fett)

Ich versuche, eine Abfrage zu erstellen, um alle Teile auszuwählen, die von mindestens zwei Lieferanten erstellt werden:

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

Erstens, gehe ich das überhaupt richtig an?

Zweitens bekomme ich diesen Fehler:

1111 - Ungültige Verwendung der Gruppenfunktion

Was mache ich falsch?


75
2018-02-25 00:54


Ursprung


Antworten:


Sie müssen HAVING verwenden, nicht WHERE.

Der Unterschied ist: Die WHERE-Klausel filtert, welche Zeilen MySQL auswählt. Dann MySQL gruppiert die Zeilen zusammen und aggregiert die Zahlen für Ihre COUNT-Funktion.

HAVING ist wie WHERE, nur passiert es nach Der COUNT-Wert wurde berechnet, sodass er wie erwartet funktioniert. Schreiben Sie Ihre Unterabfrage wie folgt um:

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

129
2018-02-25 00:59



Erstens, der Fehler, den Sie bekommen, hängt davon ab, wo Sie den verwenden COUNT Funktion - Sie können keine Aggregat - (oder Gruppen -) Funktion in der WHERE Klausel.

Zweitens, anstatt eine Unterabfrage zu verwenden, verbinden Sie einfach die Tabelle mit sich selbst:

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

Was ich glaube, sollte nur Zeilen zurückgeben, wo mindestens zwei Zeilen mit demselben existieren pid aber es gibt mindestens 2 sids. Um sicherzustellen, dass Sie nur eine Zeile pro erhalten pid Ich habe eine Gruppierungsklausel angewendet.


6
2018-02-25 00:56