Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL组_CONCAT:格式化输出_Php_Mysql_Group Concat - Fatal编程技术网

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
或任何其他您喜欢的标识符。