我目前有以下查询:
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
我需要帮助搞清楚三件事:
如何在名字和姓氏之间添加空格?
每个逗号后如何插入空格?
如何在显示姓氏前添加'和'?
答案 0 :(得分:5)
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'
两次,而不是一次,因为他们是不同的人。)
答案 1 :(得分:3)
我不确定你应该欺骗MySQL做你想做的事情。我建议使用以下内容:
SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name
FROM names;
然后在PHP中循环遍历此结果集并处理'和'的情况。
如果表现是一个问题(你经常会这样做)。你不会在CONCAT的计算值(第一个,',最后一个)上使用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行。我相信你可以弄清楚如何处理只返回一个名字的情况。 :)