MySQL GROUP_CONCAT Soru - Muhtemelen Basit

2 Cevap php

Şu anda aşağıdaki sorgu var:

SELECT group_concat(DISTINCT usrFirst, usrLast) as receiver_name  //etc

PHP kullanarak aşağıdaki gibi, bu isimler benim listesini verir:

<?php 
    echo $row['receiver_name'];

    //Outputs: JohnDoe,BillSmith,DaveJones

    //Desired ouput: John Doe, Bill Smith, and Dave Jones

Temelde, ben üç şeyi bulmaktan yardıma ihtiyacım var:

1) nasıl ilk ve son isim arasında, bir, boşluk koyabilirsiniz?

2) Nasıl her virgülden sonra bir boşluk ekleyebilirsiniz?

3) Nasıl bir 've' soyadı hemen önce görüntülenen ekleyebilirsiniz?

Çok teşekkürler!

2 Cevap

Ben size orada istediğiniz tam olarak ne yapıyor içine MySQL kabadayı emin değilim. Ben şu kullanarak öneririm:

SELECT DISTINCT CONCAT(first, ' ', last) AS receiver_name
FROM names;

Sonra PHP bu resultset'de döngü ve olgusunu 've' orada anlaştım.

Performans (sık sık bu sorguyu yapıyor olacak) bir endişe varsa. Geçici bir tablo kullanımını gerektiren gibi (son ',' ilk) concat hesaplanan değeri DISTINCT kullanarak değil yararlanacak.

Çimdik, aşağıdaki dizini ekleyin:

ALTER TABLE names ADD INDEX (last, first);

Aşağıdaki gibi Ve sorguyu değiştirin:

SELECT CONCAT(first, ' ', last) AS receiver_name
FROM names
GROUP BY last, first;

Geçici bir tablo veya FileSort başvurmadan endeksi doğrudan değerleri almak mümkün olacak.

Bildiğim kadarıyla döngü gider gibi, aşağıdaki gibi bir şey çalışmak:

<?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
}

Note Bu kod her zaman en az 2 satır döndü olurdu varsayar. Ben size iade sadece tek bir ismin durumda işlemek için nasıl anlamaya eminim. :)

SELECT  GROUP_CONCAT(CONCAT_WS(' ', usrFirst, usrLast)) as receiver_name
FROM    (
        SELECT  DISTINCT usr_first, usr_last
        FROM    mytable
        ) q

Bu çözüm 'Smith, John Davis' ve 'Davis Smith, John' (onlar farklı insanlar olduğu, bir kez değil, iki kez 'John Davis Smith' dönecektir) ayırt edecektir.