Группировка SQL с несколькими соединениями, неправильно объединяющими результаты

StackOverflow https://stackoverflow.com/questions/2542859

  •  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")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top