我不确定你应该欺负 MySQL 做你想做的事。我建议使用以下内容:
SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name
FROM names;
然后在 PHP 中循环遍历这个结果集并在那里处理 ' 和 ' 的情况。
如果性能是一个问题(你会经常做这个查询)。您将从不对 CONCAT(first, ' ', last) 的计算值使用 DISTINCT 中受益,因为这需要使用临时表。
要对其进行调整,请添加以下索引:
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 行。我相信您可以弄清楚如何处理仅返回一个名称的情况。:)