سؤال

لدي حاليا الاستعلام التالي:

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

أحتاج إلى مساعدة في معرفة ثلاثة أشياء:

  1. كيف أضع مسافة بين الاسم الأول والأخير؟

  2. كيف يمكن إدراج مسافة بعد كل فاصلة؟

  3. كيف يمكنني إضافة "و" مباشرة قبل عرض الاسم الأخير؟

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

المحلول

لست متأكدًا من أنه يجب عليك إجبار 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' مرتين، وليس مرة واحدة، لأنهما شخصان مختلفان).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top