2016-03-27 12 views
0

Ich habe folgende Abfrage zu lösen:Aggregation MAX GRAF Sub-Abfrage, mit Verknüpfungen

„Liste das Mitglieds (n), die in und nach 1990 geboren sind, und haben die Hackathons organisiert, die eine Förderung aus dem Projekt erhalten haben (s), die die höchste Anzahl an Labors haben, die an ihnen arbeiten. "

Die SELECT MAX gibt mir die höchste projectID (Nummer) in der Zeile, nicht die höchste COUNT von projectID.

Wie bekomme ich die "MAX COUNT" von projectID in Tabelle: LabInProject?

Ich habe versucht, indem ich eine Unterabfrage mit einer abgeleiteten Tabelle: totalCount, aber ich weiß nicht, wie man dies mit den Joins verbindet, es funktioniert nicht.

HAVING COUNT(*) = 
(
    SELECT COUNT(projectID) totalCount 
    FROM LabInProject 
    GROUP BY projectID 
    LIMIT 1 
) 
+0

Bitte senden Sie das Schema aller Tabellen und durch die Art und Weise Sie sind nicht erlaubt (logisch falsch) die Spalten mit Aggregatfunktion anzuzeigen, die in der nicht vorhanden sind Gruppierung nach Klausel. Es wird sehr nett sein, wenn Sie eine SQL-Geige http://sqlfiddle.com/ – geeksal

Antwort

0
WHERE LabInProject.projectID = (SELECT MAX(LabInProject.projectID) FROM LabInProject) 

Sie haben eine Syntax-Fehler hier. Versuchen Sie, die schließende Klammer am Ende der Anweisung zu veröffentlichen.

0

Betrachten Sie die unten abgeleitete Tabelle in einem inneren Join mit eigenen abgeleiteten Tabellen, um die frühere WHERE Bedingung zu ersetzen. Dies sollte mehrere Projekte zurück, die gleiche maximale zählt teilen:

... 
INNER JOIN 
    -- OBTAIN PROJECT AND COUNTS CONDITIONED TO THE MAX 
    (SELECT sub.ProjectID, Count(*) As ProjectIDCount 
    FROM LabInProject sub 
    INNER JOIN Project ON LabInProject.projectID=Project.projectID 
    INNER JOIN Hackathon ON Project.projectID=Hackathon.fundingProject 
    INNER JOIN Hubs ON Hackathon.eventID=Hubs.eventID 
    INNER JOIN Member ON Member.email=Hubs.organiserMember 
    WHERE Member.dateOfBirth > '1990' 
    GROUP BY sub.ProjectID 
    HAVING Count(*) IN 
     -- OBTAIN SCALAR VALUE OF MAX PROJECT COUNT 
     (SELECT Max(dT.ProjectIDCount) As MaxOfProjectIDCount 
     FROM 
      -- OBTAIN PROJECT COUNTS 
      (SELECT subdT.ProjectID, Count(*) As ProjectIDCount 
      FROM LabInProject subdT 
      INNER JOIN Project ON LabInProject.projectID=Project.projectID 
      INNER JOIN Hackathon ON Project.projectID=Hackathon.fundingProject 
      INNER JOIN Hubs ON Hackathon.eventID=Hubs.eventID 
      INNER JOIN Member ON Member.email=Hubs.organiserMember 
      WHERE Member.dateOfBirth > '1990' 
      GROUP BY subdT.ProjectID) As dT) 
    ) As temp 
ON LabInProject.projectID = temp.projectID 
... 
+0

Vielen Dank für die Antwort. –

+0

Danke für die Antwort. Es klappt. Ich versuche, die Abfrage zu ändern, damit die Bedingung: HAVING Member.dateOfBirth> = '1990' vor der Unterabfrageaggregation von COUNT und MAX ausgeführt wird. Entsprechend der Abfrage: Member.DateOfBirth> = '1990' muss vor dem COUNT MAX von projectID ausgewählt werden (HAVING/WHERE). Es scheint unmöglich zu sein, WHERE/HAVING Member.dateOfBirth> '1990' mit INNER JOIN Member ON Member.email = Hubs.organiserMember zu implementieren. Also muss ich mich einer anderen Unterabfrage anschließen? –

+0

Sie müssen die Bedingung in der Abfrage und damit alle zugehörigen Join-Tabellen verschieben. Ich habe eine solche Bearbeitung begonnen, aber in Ihrem Beitrag erwähnt die Frage, dass Sie das * ... Projekt (s) mit der größten Anzahl an Labors, die an ihnen arbeiten *, ziehen (und von einer solchen Projektliste nach bestimmten Mitgliederaltern filtern). Auch diese Bedingung sollte in der Klausel "WHERE" und nicht in "HAVING" (normalerweise für Zuschlagstoffe) enthalten sein. – Parfait