2017-08-31 1 views
1

Ich bin in einem Projekt, wo ich JSON-Daten von einer externen API in die MySQL-Datenbank einfügen. Das funktioniert gut.Ausgabe nach Gruppe - vielleicht foreach?

Die Ausgabe mit GROUPING und ORDER BY ist nicht wirklich, wie ich es will

Was ich so weit gekommen:

SELECT *, GROUP_CONCAT(DISTINCT (task)) 
FROM time_summary 
GROUP BY projectName 
ORDER BY clientName 

Die Tabelle sieht wie folgt aus:

id  clientName   project    task 
1  firm One   online    banner 
2  firm One   print    folder 
3  firm Two   water    with gas 
4  firm One   online    website 
5  firm Two   water    with gas 
6  firm Two   water    with gas 

Ausgabe ist:

firmaOne
  Online
    Banner, Website
  Druck
    Ordner

Nun ist die Frage: Die gruppierten Aufgaben durch Kommas getrennt sind.

Ich habe eine while-Schleife Ausgang - aber ich brauche jede Aufgabe in einer neuen Zeile (durch das Projekt gruppiert) wie

firmOne
  Online
    Banner
    Website
  Drucken
    Ordner

PHP-Code ist wie diese:

$new = 1; 

$last_client = 'initial'; 

while($row = _mysql_fetch_array($sql)) { 
    if($last_client != $row['clientName'] && $last_client != 'initial') { 
     echo '<div class="cb h20"></div>'; 
     $new = 1; 
    } 

    if($new == 1) { 
     echo '<span class="yellow-small">' . $row["clientName"] . '</span>'; 
     $new = 0; 
    } 
    ?> 
    <b><?=$row['projectName'];?></b><br> 

     <?=$row['GROUP_CONCAT(DISTINCT (task))'];?> 
} 

Wie kann ich das erreichen?

+0

Spaltennamen und Code Sie nicht zu passen scheint ???? – RiggsFolly

+0

Sorry, schreibe einfach zu schnell: D ich repariere es –

+0

'SELECT *, .... GROUP BY projectName' ist schlechte Verwendung von SQL https://www.psce.com/en/blog/2012/05/15/mysql-faults-do-you-use-group-by-korrekt/ –

Antwort

1

Die Aufgaben in CSV zu aggregieren, nur um sie dann wieder in Ihrem PHP-Code zu teilen, klingt für mich nicht nach einer guten Option.Würde die folgende einfache Abfrage, die Sie nicht die Daten geben Sie wollen:

SELECT DISTINCT 
    clientName, 
    project, 
    task 
FROM time_summary 
ORDER BY 
    clientName, 
    project, 
    task 

Diese Abfrage würde berichten, für jeden Kunden und Projekt, nur die eindeutige Liste von Aufgaben. Jetzt können Sie dieses Ergebnis iterieren in Ihrem PHP-Code setzen Sie die Ausgabe, die Sie generieren möchten:

$client = null; 
$project = null; 

while ($row = _mysql_fetch_array($sql)) { 
    $curr_client = $row['clientName']; 
    if ($curr_client != $client) { 
     echo $curr_client."<br>"; 
     $client = $curr_client; 
    } 

    $curr_project = $row['projectName']; 
    if ($curr_project != $project) { 
     echo " ".$curr_project."<br>"; 
     $project = $curr_project; 
    } 

    echo " ".$row['task']."<br>"; 
} 

Ausgang:

enter image description here

Als Haftungsausschluss, konzentrierte ich mich auf die Abfrage und Darstellung Logik benötigt, um die gewünschte Anzeige zu bekommen, nicht auf den PHP-Code. Das könnte das Thema einer weiteren Diskussion sein. Hier

ist ein Link zu einer kleinen PHP-Demo, die zeigt, dass die Präsentationslogik ist zuverlässig:

Rextester

+0

@RaymondNijland Ich bin mir sicher, dass es im OP alle möglichen schlechten PHP-Dinge gibt und möglicherweise meine Antwort. Ich konzentriere mich auf die Abfrage und die Darstellungslogik. –

+0

Es ist eine Funktion für PDO .. Funktion _mysql_fetch_array() { \t Rückgabe $ GLOBALS ['_ pdo_s'] -> Fetch (PDO :: FETCH_ASSOC); } –

+0

danke, das funktioniert! –

0

Wenn Sie einfach die Zeile

$holder = str_replace(",", "<br>", $row['GROUP_CONCAT(DISTINCT (taskName))']);

Direkt vor Ihren <?=$row['GROUP_CONCAT(DISTINCT (taskName))'];?>

Und dann ersetzen Sie die Zeile

<?=$row['GROUP_CONCAT(DISTINCT (taskName))'];?>

mit

<?=$holder;?>

Dadurch wird das Komma durch <br> ersetzt und der zweite Wert wird auf die nächste Zeile gesetzt.