SQL Raggruppamento con più join combinare i risultati in modo non corretto
-
23-09-2019 - |
Domanda
Ciao Ho problemi con la mia interrogazione unisce record quando non dovrebbe.
Ho due tavoli Autori e pubblicazioni, sono legati da ID di pubblicazione in una relazione molti a molti. Come ogni autore può avere molte pubblicazioni ed ogni pubblicazione ha molti Autori. Voglio che la mia query per restituire ogni pubblicazione per una serie di autori e di includere l'ID di ciascuno degli altri autori che hanno contribuito alla pubblicazione raggruppate in un campo. (Sto lavorando con mySQL)
Ho cercato di immaginare graficamente seguente
Table: authors Table:publications
AuthorID | PublicationID PublicationID | PublicationName
1 | 123 123 | A
1 | 456 456 | B
2 | 123 789 | C
2 | 789
3 | 123
3 | 456
Voglio che il mio risultato impostato per essere il seguente
AuthorID | PublicationID | PublicationName | AllAuthors
1 | 123 | A | 1,2,3
1 | 456 | B | 1,3
2 | 123 | A | 1,2,3
2 | 789 | C | 2
3 | 123 | A | 1,2,3
3 | 456 | B | 1,3
Questa è la mia domanda
Select Author1.AuthorID,
Publications.PublicationID,
Publications.PubName,
GROUP_CONCAT(TRIM(Author2.AuthorID)ORDER BY Author2.AuthorID ASC)AS 'AuthorsAll'
FROM Authors AS Author1
LEFT JOIN Authors AS Author2
ON Author1.PublicationID = Author2.PublicationID
INNER JOIN Publications
ON Author1.PublicationID = Publications.PublicationID
WHERE Author1.AuthorID ="1" OR Author1.AuthorID ="2" OR Author1.AuthorID ="3"
GROUP BY Author2.PublicationID
Ma restituisce il seguente invece
AuthorID | PublicationID | PublicationName | AllAuthors
1 | 123 | A | 1,1,1,2,2,2,3,3,3
1 | 456 | B | 1,1,3,3
2 | 789 | C | 2
Lo fa consegnare l'output desiderato, quando v'è un solo AuhorID nella dichiarazione dove. Non sono stato in grado di capirlo, qualcuno sa dove sto andando male?
Soluzione
Per eliminare autori duplicati, modificare:
ON Author1.PublicationID = Author2.PublicationID
a:
ON Author1.PublicationID = Author2.PublicationID AND
Author1.AuthorID <> Author2.AuthorID
Inoltre, il cambiamento:
GROUP BY Author2.PublicationID
a:
GROUP BY Author1.AuthorID, Author2.PublicationID
Altri suggerimenti
Credo che io non sono sicuro perché è necessario GROUP BY, in primo luogo. Perché non si potrebbe utilizzare una subquery correlata in questo modo:
Select Author1.AuthorID
, Publications.PublicationID
, Publications.PubName
, (
Select GROUP_CONCAT(TRIM(Author2.AuthorID) ORDER BY Author2.AuthorID ASC)
From Authors As Author2
Where Author2.PublicationID = Publications.PublicationID
) AS 'AuthorsAll'
FROM Authors AS Author1
INNER JOIN Publications
ON Author1.PublicationID = Publications.PublicationID
Where Author1.AuthorId In("1","2","3")