mysql group_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
세 가지를 알아내는 데 도움이 필요합니다.
첫 번째 이름과 성 사이에 공간을 어떻게 올릴 수 있습니까?
각 쉼표 이후에 공간을 어떻게 삽입 할 수 있습니까?
성이 표시되기 직전에 '와'를 추가하려면 어떻게해야합니까?
해결책
나는 당신이 당신이 원하는 것을 정확하게 수행하기 위해 MySQL을 괴롭히는 것을 확실하지 않습니다. 다음을 사용하는 것이 좋습니다.
SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name
FROM names;
그런 다음 PHP 에서이 결과 세트를 루프하고 '및' '사례를 처리하십시오.
성능이 우려되는 경우 (이 쿼리를 자주 수행 할 것입니다). 임시 테이블을 사용해야하는 CONCAT (첫 번째, '', 마지막)의 계산 된 값에 대해 별개의 사용을 사용하지 않으면 혜택을받을 수 있습니다.
조정하려면 다음 색인을 추가하십시오.
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 개의 행이 반환된다고 가정합니다. 반환 된 단일 이름 만 처리하는 방법을 알아낼 수 있다고 확신합니다. :)
다른 팁
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'
그들은 다른 사람들이기 때문에 두 번, 한 번은 아닙니다).
제휴하지 않습니다 StackOverflow