Domanda

Al momento ho la seguente query:

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

Quando si utilizza PHP, genera il mio elenco di nomi come segue:

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

    //Outputs: JohnDoe,BillSmith,DaveJones

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

Ho bisogno di aiuto per capire tre cose:

  1. Come posso inserire uno spazio tra il nome e il cognome?

  2. Come si può inserire uno spazio dopo ogni virgola?

  3. Come posso aggiungere un 'e' subito prima della visualizzazione del cognome?

È stato utile?

Soluzione

Non sono sicuro che dovresti costringere MySQL a fare esattamente quello che vuoi lì. Suggerirei di utilizzare quanto segue:

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

Quindi scorrere questo set di risultati in PHP e gestire il caso di 'e' lì.

Se le prestazioni sono un problema (farai spesso questa query). Potresti trarre vantaggio dal non usare DISTINCT sul valore calcolato di CONCAT (primo, '', ultimo) poiché ciò richiederebbe l'uso di una tabella temporanea.

Per modificarlo, aggiungi il seguente indice:

ALTER TABLE names ADD INDEX (last, first);

E modifica la query come segue:

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

Sarai in grado di ottenere i tuoi valori direttamente dall'indice senza ricorrere a una tabella temporanea o fileort.

Per quanto riguarda il ciclo, funzionerebbe qualcosa di simile al seguente:

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

Nota Questo codice presuppone che vengano sempre restituite almeno 2 righe. Sono sicuro che puoi capire come gestire il caso di un solo nome restituito. :)

Altri suggerimenti

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

Questa soluzione distinguerà tra 'Smith, John Davis' e 'Davis Smith, John' (restituirà 'John Davis Smith' due volte, non una volta, poiché sono persone diverse).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top