문제

현재 다음 쿼리가 있습니다.

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. 성이 표시되기 직전에 '와'를 추가하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

나는 당신이 당신이 원하는 것을 정확하게 수행하기 위해 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' 그들은 다른 사람들이기 때문에 두 번, 한 번은 아닙니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top