Regroupement SQL avec plusieurs jointures combinant les résultats de manière incorrecte
-
23-09-2019 - |
Question
Salut, je vais avoir des problèmes avec ma requête combinant des enregistrements quand il ne devrait pas.
J'ai deux tableaux auteurs et publications, ils sont liés par ID de publication dans une relation plusieurs à plusieurs. Comme chaque auteur peut avoir de nombreuses publications et chaque publication a de nombreux auteurs. Je veux que ma requête pour retourner toutes les publications pour un ensemble d'auteurs et inclure l'ID de chacun des autres auteurs qui ont contribué à la publication regroupées en un seul champ. (Je travaille avec mySQL)
J'ai essayé de l'imaginer graphique ci-dessous
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
Je veux que mon jeu de résultats dans les suivantes
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
Ceci est ma requête
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
Mais il renvoie le message suivant à la place
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
Il ne délivrer la sortie désirée quand il n'y a qu'un seul AuhorID dans la déclaration où. Je n'ai pas été en mesure de le comprendre, personne ne sait où je vais mal?
La solution
Pour éliminer les auteurs en double, le changement:
ON Author1.PublicationID = Author2.PublicationID
à:
ON Author1.PublicationID = Author2.PublicationID AND
Author1.AuthorID <> Author2.AuthorID
En outre, le changement:
GROUP BY Author2.PublicationID
à:
GROUP BY Author1.AuthorID, Author2.PublicationID
Autres conseils
Je suppose que je ne sais pas pourquoi vous avez besoin du GROUP BY en premier lieu. Pourquoi ne pourriez-vous utiliser une sous-requête corrélée comme ceci:
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")