سؤال

استخدام MySQL, ، يمكنني أن أفعل شيئًا مثل:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

مخرجاتي:

shopping
fishing
coding

ولكن بدلاً من ذلك أريد فقط صفًا واحدًا وعمودًا واحدًا:

الناتج المتوقع:

shopping, fishing, coding

والسبب هو أنني أحدد قيمًا متعددة من جداول متعددة، وبعد كل الصلات لدي صفوف أكثر بكثير مما أريد.

لقد بحثت عن وظيفة على وثيقة ماي إس كيو إل وأنها لا تبدو مثل CONCAT أو CONCAT_WS تقبل الوظائف مجموعات النتائج، فهل يعرف أحد هنا كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

كما ذكر لودفيج في تعليقه، يمكنك إضافة DISTINCT عامل لتجنب التكرارات:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

كما ذكر جان في تعليقهم، يمكنك أيضًا فرز القيم قبل تفجيرها باستخدامها ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

كما ذكر داغ في تعليقه، هناك حد 1024 بايت للنتيجة.لحل هذه المشكلة، قم بتشغيل هذا الاستعلام قبل الاستعلام الخاص بك:

SET group_concat_max_len = 2048;

بالطبع، يمكنك التغيير 2048 وفقا لاحتياجاتك.لحساب وتعيين القيمة:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);

نصائح أخرى

القي نظرة على GROUP_CONCAT إذا كان إصدار MySQL (4.1) الخاص بك يدعمه.يرى وثائق لمزيد من التفاصيل.

سيبدو شيئًا مثل:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

بناء جملة بديل للتسلسل صفوف متعددة وفردية

تحذير:هذا المنصب سوف يجعلك جائعا.

منح:

لقد وجدت نفسي أرغب في ذلك حدد صفوفًا متعددة وفردية- بدلاً من المجموعة - والتسلسل في مجال معين.

لنفترض أن لديك جدولًا بمعرفات المنتجات وأسمائها وأسعارها:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

ثم لديك بعض الاجاكس الفاخرة التي تدرج هذه الجراء كمربعات اختيار.

يختار مستخدم فرس النهر الجائع 13, 15, 16.لا حلوى لها اليوم...

يجد:

طريقة لتلخيص طلب المستخدم الخاص بك في سطر واحد، باستخدام MySQL خالص.

حل:

يستخدم GROUP_CONCAT مع ال ال IN بند:

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

ما هي المخرجات:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

حل المكافأة:

إذا كنت تريد السعر الإجمالي أيضًا، أرسله SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

ملاحظة:الاعتذار إذا لم يكن لديك في الداخل و في الخارج مجاور...

يمكنك تغيير الحد الأقصى لطول GROUP_CONCAT القيمة عن طريق تحديد group_concat_max_len معامل.

انظر التفاصيل في توثيق MySQL.

هناك وظيفة تجميعية GROUP، GROUP_CONCAT.

في حالتي كان لدي صف من المعرفات، وكان من الضروري تحويله إلى حرف، وإلا فسيتم ترميز النتيجة في تنسيق ثنائي:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

استخدم متغير جلسة MySQL(5.6.13) وعامل التعيين كما يلي

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

ثم يمكنك الحصول عليها

test1,test11

كان لدي استفسار أكثر تعقيدًا، ووجدت أنه يجب علي استخدامه GROUP_CONCAT في استعلام خارجي لتشغيله:

الاستعلام الأصلي:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

انفجر:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

نأمل أن يكون هذا قد يساعد شخص ما.

جرب هذا:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

لمن يبحث هنا عن كيفية الاستخدام GROUP_CONCAT مع استعلام فرعي - نشر هذا المثال

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

لذا GROUP_CONCAT يجب استخدامه داخل الاستعلام الفرعي، وليس تغليفه.

لدينا طريقتان لتسلسل الأعمدة في MySql

select concat(hobbies) as `Hobbies` from people_hobbies where 1

أو

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top