مجموعة MySQL_CONCAT:تنسيق الإخراج
-
06-07-2019 - |
سؤال
لدي حاليا الاستعلام التالي:
SELECT group_concat(DISTINCT usrFirst, usrLast) as receiver_name //etc
عند استخدام PHP، فإنه يخرج قائمة الأسماء الخاصة بي على النحو التالي:
<?php
echo $row['receiver_name'];
//Outputs: JohnDoe,BillSmith,DaveJones
//Desired output: John Doe, Bill Smith, and Dave Jones
أحتاج إلى مساعدة في معرفة ثلاثة أشياء:
كيف أضع مسافة بين الاسم الأول والأخير؟
كيف يمكن إدراج مسافة بعد كل فاصلة؟
كيف يمكنني إضافة "و" مباشرة قبل عرض الاسم الأخير؟
المحلول
لست متأكدًا من أنه يجب عليك إجبار MySQL على فعل ما تريده بالضبط هناك.أقترح استخدام ما يلي:
SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name
FROM names;
ثم قم بالتكرار خلال مجموعة النتائج هذه في PHP وتعامل مع حالة ' و ' هناك.
إذا كان الأداء مصدر قلق (ستقوم بهذا الاستعلام كثيرًا).ستستفيد من عدم استخدام DISTINCT على القيمة المحسوبة لـ CONCAT(first، ''، last) لأن ذلك يتطلب استخدام جدول مؤقت.
لتعديله، أضف الفهرس التالي:
ALTER TABLE names ADD INDEX (last, first);
وقم بتغيير الاستعلام الخاص بك كما يلي:
SELECT CONCAT(first, ' ', last) AS receiver_name
FROM names
GROUP BY last, first;
ستتمكن من الحصول على القيم الخاصة بك مباشرة من الفهرس دون اللجوء إلى جدول مؤقت أو فرز الملفات.
بقدر ما تذهب الحلقة، سيعمل شيء مثل ما يلي:
<?php
$mysqli = new mysqli(/* connection info */);
$sql = "SELECT CONCAT(first, ' ', last) AS receiver_name "
. 'FROM names '
. 'GROUP BY last, first';
if ($result = $mysqli->query($sql)) {
$string = '';
$count = $result->num_rows;
$rows = $result->fetch_all();
for ($i = 0; $i < $count-1; $i++) {
$string .= $rows[$i][0] . ', ';
}
$string .= ' and ' . $rows[$i][0];
echo $string; // John Smith, Bob Dole, and George Bush
}
ملحوظة يفترض هذا الرمز أنه سيتم دائمًا إرجاع صفين على الأقل.أنا متأكد من أنه يمكنك معرفة كيفية التعامل مع حالة إرجاع اسم واحد فقط.:)
نصائح أخرى
SELECT GROUP_CONCAT(CONCAT_WS(' ', usrFirst, usrLast)) as receiver_name
FROM (
SELECT DISTINCT usr_first, usr_last
FROM mytable
) q
هذا الحل سوف يميز بين 'Smith, John Davis'
و 'Davis Smith, John'
(سيعود 'John Davis Smith'
مرتين، وليس مرة واحدة، لأنهما شخصان مختلفان).