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

次の 3 つのことを理解するのに助けが必要です。

  1. 姓と名の間にスペースを入れるにはどうすればよいですか?

  2. 各コンマの後にスペースを挿入するにはどうすればよいですか?

  3. 表示される姓の直前に「and」を追加するにはどうすればよいですか?

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'します (彼らは別の人なので、1 回ではなく 2 回'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 行が返されることを前提としています。名前が 1 つだけ返された場合の処理​​方法を理解できるはずです。:)

于 2009-07-31T16:05:02.743 に答える