Pergunta

Olá, estou tendo problemas com minha consulta combinando recordes quando não deveria.

Eu tenho duas tabelas autores e publicações, elas são relacionadas pelo ID da publicação em muitos a muitos relacionamentos. Como cada autor pode ter muitas publicações e cada publicação tem muitos autores. Quero que minha consulta retorne todas as publicações para um conjunto de autores e inclua o ID de cada um dos outros autores que contribuíram para a publicação agrupada em um campo. (Estou trabalhando com o MySQL)

Eu tentei imaginá -lo graficamente abaixo

    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

Eu quero que meu conjunto de resultados seja o seguinte

 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

Esta é minha consulta

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

Mas ele retorna o seguinte

 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

Ele fornece a saída desejada quando existe apenas um Auhorid na declaração onde. Não consegui descobrir, alguém sabe onde estou dando errado?

Foi útil?

Solução

Para eliminar autores duplicados, mude:

ON Author1.PublicationID = Author2.PublicationID

para:

ON Author1.PublicationID = Author2.PublicationID AND
   Author1.AuthorID <> Author2.AuthorID

Além disso, mude:

GROUP BY Author2.PublicationID

para:

GROUP BY Author1.AuthorID, Author2.PublicationID

Outras dicas

Suponho que não estou ao certo por que você precisa do grupo em primeiro lugar. Por que você não poderia usar uma subconsulta correlacionada como assim:

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")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top