2009-07-31 45 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