Frage

Im Moment habe ich die folgende Abfrage:

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

Bei der Verwendung von PHP, gibt sie meine Liste von Namen wie folgt:

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

    //Outputs: JohnDoe,BillSmith,DaveJones

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

Ich brauche Hilfe drei Dinge herauszufinden:

  1. Wie kann ich einen Raum zwischen den Vor- und Nachnamen?

  2. Wie kann ein Leerzeichen nach jedem Komma einfügen?

  3. Wie kann ich eine ‚und‘ rechts vor dem Nachname angezeigt hinzufügen?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, dass Sie sollten MySQL schikanieren in genau das, was Sie dort wollen. Ich würde vorschlagen, auf folgende Arten:

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

Dann Schleife durch dieses Suchresultates in PHP und behandelt den Fall ‚und‘ dort.

Wenn die Leistung ist ein Anliegen (Sie werden diese Abfrage oft tun). Sie würden von nicht DISTINCT auf dem berechneten Wert von CONCAT mit (ersten, ‚‘, lesen) als dass die Verwendung einer temporären Tabelle erfordern würde.

Um es zu zwicken, fügen Sie den folgenden Index:

ALTER TABLE names ADD INDEX (last, first);

Und Ihre Abfrage wie folgt ändern:

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

können Sie Ihre Werte direkt aus dem Index erhalten, ohne in einer temporären Tabelle oder filesort greifen zu müssen.

Was die Schleife geht, so etwas wie die folgenden funktionieren würde:

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

Hinweis Dieser Code wird davon ausgegangen würden Sie haben immer mindestens zwei Zeilen zurückgegeben. Ich bin sicher, dass Sie herausfinden, wie der Fall von nur einem einzigen Namen zurückgegeben zu behandeln. :)

Andere Tipps

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

Diese Lösung wird unterschieden zwischen 'Smith, John Davis' und 'Davis Smith, John' (kehrt 'John Davis Smith' zweimal, nicht einmal, weil sie unterschiedliche Menschen sind).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top