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