Я не уверен, что вы должны заставить 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
}
Примечание В этом коде предполагается, что вам всегда будет возвращено как минимум 2 строки. Я уверен, что вы можете понять, как обрабатывать регистр только с одним возвращенным именем. :)