MySQL GROUP_CONCAT: форматирование вывода

В настоящее время у меня есть следующий запрос:

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 (сначала «последний», «последний»), так как это потребует использования временной таблицы.

Чтобы настроить его, добавьте следующий индекс:

 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 } 

Примечание. Этот код предполагает, что вы всегда будете иметь как минимум 2 строки. Я уверен, что вы можете понять, как обрабатывать случай только одного возвращенного имени. 🙂

 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' , не один раз, поскольку они разные люди).