هل يمكن أن أقوم بتسلسل صفوف MySQL متعددة في حقل واحد؟




concat group-concat (6)

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

تحذير: هذه الوظيفة ستجعلك جائع.

معطى:

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

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

+------------+--------------------+-------+
| 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 |
+------------+--------------------+-------+

ثم لديك بعض ajax يتوهم - schmancy الذي يسرد هذه الجراء قبالة كما مربعات الاختيار.

يختار مستخدم hippry-hippo الخاص بك 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 |
+------------------------------------------------+-------+

ملاحظة: اعتذارات إذا لم يكن لديك داخل- N-Out القريبة ...

باستخدام MySQL ، يمكنني القيام بشيء مثل:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

الإخراج الخاص بي:

shopping
fishing
coding

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

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

shopping, fishing, coding

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

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


ألقِ نظرة على GROUP_CONCAT إذا كان إصدار MySQL (4.1) يدعمها. انظر GROUP_CONCAT لمزيد من التفاصيل.

سيبدو الأمر كالتالي:

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

جرب هذا:

DECLARE @Hobbies NVARCHAR(200) = ' '

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

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

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


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

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

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

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

كما ذكر Jan في تعليقه / ها ، يمكنك أيضًا ترتيب القيم قبل أن تنفجر باستخدام 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