سؤال

دعنا نقول مخطط 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 من إنتاج سطر لهذا المنتج، على الرغم من وجود غادر الانضمام.

  1. هل هذا سلوك MySQL المتوقع؟
  2. هل هناك أي طريقة يمكنني الحصول على الإخراج المتوقع باستخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top