MySQL グループ_CONCAT:出力のフォーマット
-
06-07-2019 - |
質問
現在、次のようなクエリがあります。
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 つのことを理解するために助けが必要です。
姓と名の間にスペースを入れるにはどうすればよいですか?
各カンマの後にスペースを挿入するにはどうすればよいですか?
表示される姓の直前に「and」を追加するにはどうすればよいですか?
解決
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 つだけ返された場合の対処方法はきっとわかると思います。:)
他のヒント
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'
を返します)彼らは異なる人々であるため、1回ではなく2回)。
所属していません StackOverflow