Agrupamento SQL com várias junções combinando resultados incorretamente
-
23-09-2019 - |
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?
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")