Php MySQL组_CONCAT:格式化输出
我目前有以下疑问:Php MySQL组_CONCAT:格式化输出,php,mysql,group-concat,Php,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 Jon
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
SELECT CONCAT(first, ' ', last) AS receiver_name
FROM names
GROUP BY last, first;
我不确定你是否应该强迫MySQL完全按照你的意愿去做。我建议使用以下方法:
SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name
FROM names;
然后在PHP中循环这个结果集,并在那里处理“and”的情况
如果性能是一个问题(您将经常执行此查询)。如果不在CONCAT(first,,,last)的计算值上使用DISTINCT,您将受益匪浅,因为这将需要使用临时表
要对其进行调整,请添加以下索引:
ALTER TABLE names ADD INDEX (last, first);
并按如下方式更改您的查询:
<?php
echo $row['receiver_name'];
//Outputs: JohnDoe,BillSmith,DaveJones
//Desired output: John Doe, Bill Smith, and Dave Jones
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
}
此解决方案将区分'Smith,John Davis'
和'Davis Smith,John'
(将返回'John Davis Smith'
两次,而不是一次,因为他们是不同的人)。谢谢hobodave。您是否可以介绍一下如何进行php循环?或者给我指一个资源的方向。谢谢。你代码中的最后一个字母q
有什么特殊意义吗?@Adam:没有,那是一个嵌套的查询别名。您可以将其设置为p
或任何其他您喜欢的标识符。