2009-07-31 39 views
2

目前,我有以下查询: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 Jones 

我需要帮助搞清楚三件事:

  1. 如何在名字和姓氏之间留出空格?

  2. 如何在每个逗号后插入空格?

  3. 如何在姓氏显示之前添加'和'?

回答

3

我不确定你应该欺负MySQL做你想做的事情。我建议使用以下内容:

SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name 
FROM names; 

然后循环遍历PHP中的这个结果集,并处理'和'的情况。

如果性能是一个问题(你会经常做这个查询)。您将不需要对CONCAT的计算值使用DISTINCT(首先,'',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行返回。我相信你可以弄清楚如何处理只返回一个名字的情况。 :)

+0

谢谢hobodave。你可能会谈谈如何做php循环?或者将我指向资源的方向。谢谢。 – Dodinas 2009-07-31 16:20:32

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'两次,一次也没有,因为他们是不同的人)。

+0

代码中的最后一个字母`q`是否有特殊含义? – Adam 2016-06-29 14:00:05