تجميع 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

إنه يقدم الإخراج المطلوب عندما يكون هناك فقط 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

نصائح أخرى

أفترض أنني لست متأكدًا من سبب حاجتك إلى المجموعة في المقام الأول. لماذا لا يمكنك استخدام مسمة فرعية مرتبطة مثل ذلك:

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