Regroupement SQL avec plusieurs jointures combinant les résultats de manière incorrecte

StackOverflow https://stackoverflow.com/questions/2542859

  •  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?

Était-ce utile?

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")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top