【问题标题】:MySQL GROUP_CONCAT: Formatting the outputMySQL GROUP_CONCAT:格式化输出
【发布时间】:2009-07-31 15:59:47
【问题描述】:

我目前有以下查询:

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

【问题讨论】:

    标签: php mysql group-concat


    【解决方案1】:
    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'(将返回两次,而不是一次,因为他们是不同的人)。

    【讨论】:

    • 你代码中最后一个字母q有什么特殊含义吗?
    • @Adam:不,这是一个嵌套查询别名。您可以将其设为 p 或您喜欢的任何其他标识符。
    【解决方案2】:

    我不确定你应该强迫 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 行。我相信您可以弄清楚如何处理仅返回一个名称的情况。 :)

    【讨论】:

    • 谢谢 hobodave。您能否对如何进行 php 循环有所了解?或者向我指出资源的方向。谢谢。
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 2012-09-27
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多