2016-10-09 2 views
0

Ich habe eine einfache Konfiguration: 2 Tabellen in einer Viele-zu-viele-Beziehung verknüpft, so gab es mir 3 Tabellen.GROUP BY & COUNT mit mehreren Parametern

Tabelle Autor:

idAuthor INT 
name VARCHAR 

Tabelle Veröffentlichung:

idPublication INT, 
title VARCHAR, 
date YEAR, 
type VARCHAR, 
conference VARCHAR, 
journal VARCHAR 

Tabelle author_has_publication:

Author_idAuthor, 
Publication_idPublication 

Ich versuche, alle Autoren-Namen zu erhalten, die mindestens zwei Papiere veröffentlicht in Konferenz SIGMOD und Konferenz PVLDB. Im Moment habe ich das erreicht, aber ich habe immer noch ein doppeltes Ergebnis. Meine Frage:

SELECT author.name, publication.journal, COUNT(*) 
FROM author 
INNER JOIN author_has_publication 
    ON author.idAuthor = author_has_publication.Author_idAuthor 
INNER JOIN publication 
    ON author_has_publication.Publication_idPublication = publication.idPublication 
GROUP BY publication.journal, author.name 
HAVING COUNT(*) >= 2 
    AND (publication.journal = 'PVLDB' OR publication.journal = 'SIGMOD'); 

kehrt

+-------+---------+----------+ 
| name | journal | COUNT(*) | 
+-------+---------+----------+ 
| Renee | PVLDB |  2 | 
| Renee | SIGMOD |  2 | 
+-------+---------+----------+ 

Wie Sie das Ergebnis richtig sehen kann, ist aber verdoppelt, wie ich den Namen nur 1 Mal möchten.

Andere Frage, wie man den Zahlparameter für nur eine Konferenz ändert, zum Beispiel alle Autoren, die mindestens 3 SIGMOD und mindestens 1 PVLDB veröffentlicht haben?

Antwort

1

Wenn Sie sich nicht um die journal kümmern, wählen Sie es nicht aus, es teilt Ihre Ergebnisse auf. Auch normale Filter in der WHERE Klausel platziert werden müssen, nicht die HAVING Klausel:

SELECT author.name, COUNT(*) 
    FROM author 
INNER JOIN author_has_publication 
    ON author.idAuthor = author_has_publication.Author_idAuthor 
INNER JOIN publication 
    ON author_has_publication.Publication_idPublication = 
     publication.idPublication 
WHERE publication.journal IN('PVLDB','SIGMOD')  
GROUP BY author.name 
HAVING COUNT(CASE WHEN publication.journal = 'SIGMOD' THEN 1 END) >= 2 
    AND COUNT(CASE WHEN publication.journal = 'PVLDB' THEN 1 END) >= 2; 

Für die zweite Frage, benutzen Sie diese HAVING() Klausel:

HAVING COUNT(CASE WHEN publication.journal = 'SIGMOD' THEN 1 END) >= 3 
    AND COUNT(CASE WHEN publication.journal = 'PVLDB' THEN 1 END) >= 1; 
+0

dies nicht funktioniert, weil es gibt auch die Autoren, die weniger als 2 Veröffentlichung für PVLDB und SIGMOD Konferenz haben, ist die Schwierigkeit, separat jede Konferenz Publikationen –

+0

Ich missverstanden die Frage, sollte jetzt funktionieren. @Mayeulsgc – sagi

+0

Danke, es funktioniert, ich hatte eine Menge Probleme mit der Verwendung von GROUP BY, WHERE und HAVING in einer Anfrage –