2010-03-30 6 views
1

Bonjour, je rencontre des problèmes avec ma requête qui combine des enregistrements alors qu'elle ne devrait pas l'être.Regroupement SQL avec plusieurs jointures combinant incorrectement les résultats

J'ai deux tables Auteurs et Publications, elles sont reliées par Publication ID dans une relation many to many. Comme chaque auteur peut avoir de nombreuses publications et chaque publication a beaucoup d'auteurs. Je souhaite que ma requête renvoie chaque publication pour un ensemble d'auteurs et inclue l'ID de chacun des autres auteurs ayant contribué à la publication regroupée dans 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 à la

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 

suivante Voici 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 retourne à 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 délivre la sortie désirée lorsqu'il n'y a qu'un seul AuhorID dans l'instruction where. Je n'ai pas été capable de comprendre, est-ce que quelqu'un sait où je vais mal?

Répondre

0

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 
+0

Salut, Merci pour votre aide. Lorsque j'ai couru la requête sur un grand échantillon de données et a augmenté le nombre d'auteurs pour rechercher votre solution a été le plus rapide – Matt

0

Je suppose que je ne suis pas sûr 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") 
Questions connexes