2

我目前有以下查询:

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. 如何在显示的姓氏之前添加“和”?

4

2 回答 2

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

于 2009-07-31T16:09:34.637 回答
3

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

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

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

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

于 2009-07-31T16:05:02.743 回答