Agrupación SQL con múltiples uniones que combinan resultados incorrectamente
-
23-09-2019 - |
Pregunta
Hola, tengo problemas con mi consulta para combinar registros cuando no debería.
Tengo dos tablas Autores y Publicaciones, están relacionadas por ID de publicación en una relación de muchos a muchos.Como cada autor puede tener muchas publicaciones y cada publicación tiene muchos Autores.Quiero que mi consulta devuelva todas las publicaciones de un conjunto de autores e incluya la identificación de cada uno de los demás autores que han contribuido a la publicación agrupados en un campo.(Estoy trabajando con mySQL)
He intentado imaginármelo gráficamente a continuación.
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
Quiero que mi conjunto de resultados sea el siguiente
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 es mi 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
Pero en su lugar devuelve lo siguiente
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
Entrega el resultado deseado cuando solo hay un AuhorID en la declaración donde.No he podido resolverlo, ¿alguien sabe dónde me estoy equivocando?
Solución
Para eliminar duplicados autores, el cambio:
ON Author1.PublicationID = Author2.PublicationID
a:
ON Author1.PublicationID = Author2.PublicationID AND
Author1.AuthorID <> Author2.AuthorID
Además, el cambio:
GROUP BY Author2.PublicationID
a:
GROUP BY Author1.AuthorID, Author2.PublicationID
Otros consejos
supongo que no estoy seguro de por qué necesita el GROUP BY en el primer lugar. ¿Por qué no se puede utilizar una consulta correlacionada de este modo:
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")