Group_Concat و Left_join - لم تعد جميع الصفوف
-
11-09-2019 - |
سؤال
دعنا نقول مخطط DB الخاص بي كما يلي:
T_PRODUCT
id_product (int, primary)
two entries: (id_product =1) , (id_product =2)
T_USER
id_user (int, primary)
id_product (int, foreign key)
name_user (varchar)
two entries: (id_product=1,name_user='John') , (id_product=1,name_user='Mike')
إذا قمت بتشغيل استفسار أول للحصول على جميع المنتجات مع مستخدمي المستخدمين (إذا كان هناك أي)، أحصل على هذا:
SELECT T_PRODUCT.id_product, T_USER.name_user
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;
>>
id_product name_user
1 John
1 Mike
2 NULL
تبدو جيدة بالنسبة لي. الآن إذا أردت أن نفس الشيء، إلا أنني أود الحصول على منتج واحد لكل سطر، مع أسماء مستخدمين متسلسلة (إذا كان هناك أي مستخدمين، خلاف ذلك):
SELECT T_PRODUCT.id_product, GROUP_CONCAT(T_USER.name_user)
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;
>>
id_product name_user
1 John,Mike
**expected output**:
id_product name_user
1 John,Mike
2 NULL
إذا لم يكن هناك مستخدمين للمنتج، فإن Group_Concat يمنع MySQL من إنتاج سطر لهذا المنتج، على الرغم من وجود غادر الانضمام.
- هل هذا سلوك MySQL المتوقع؟
- هل هناك أي طريقة يمكنني الحصول على الإخراج المتوقع باستخدام Group_Concat أو وظيفة أخرى؟
المحلول
آه، وجدت إجابتي:
يجب أن تنسى أبدا مجموعة من جملة عند العمل مع group_concat.وبعد كنت في عداد المفقودين GROUP BY T_PRODUCT.id_product
في استعلامي الثاني.
سأترك السؤال في حال كان شخص ما غائبا عن التفكير كما أنا.
يحرر:
من هذه الإجابة, ، أنا أحسب أنني أستطيع أيضا تنشيط وضع SQL ONLY_FULL_GROUP_BY
لإجبار MySQL على رمي خطأ في حالة وجود المجموعة مفقودة أو غير صحيحة.
نصائح أخرى
بالتناوب، يمكنك استخدام Sacquery، مجرد اختبار للأداء
SELECT
T_PRODUCT.id_product,
(SELECT GROUP_CONCAT(T_USER.name_user)
FROM T_USER
WHERE T_USER.id_product = T_PRODUCT.id_product
)
FROM T_PRODUCT