Группировка SQL с несколькими соединениями, неправильно объединяющими результаты
-
23-09-2019 - |
Вопрос
Привет, у меня возникли проблемы с объединением записей в запросе, хотя этого не должно быть.
У меня есть две таблицы «Авторы» и «Публикации», они связаны идентификатором публикации в отношениях «многие ко многим».Поскольку у каждого автора может быть много публикаций, и у каждой публикации есть много авторов.Я хочу, чтобы мой запрос возвращал каждую публикацию для набора авторов и включал идентификаторы каждого из других авторов, которые внесли свой вклад в публикацию, сгруппированные в одно поле.(Я работаю с MySQL)
Я попытался изобразить это графически ниже
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
Я хочу, чтобы мой набор результатов был следующим
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
Это мой запрос
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
Но вместо этого он возвращает следующее
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
Он обеспечивает желаемый результат, когда в оператореwhere есть только один AuhorID.Я не смог понять это, кто-нибудь знает, где я ошибаюсь?
Решение
Чтобы исключить повторяющихся авторов, измените:
ON Author1.PublicationID = Author2.PublicationID
к:
ON Author1.PublicationID = Author2.PublicationID AND
Author1.AuthorID <> Author2.AuthorID
Также измените:
GROUP BY Author2.PublicationID
к:
GROUP BY Author1.AuthorID, Author2.PublicationID
Другие советы
Полагаю, я не уверен, зачем вам вообще нужна GROUP BY.Почему вы не могли использовать коррелированный подзапрос следующим образом:
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")