2016-07-24 11 views
2

Ich muss einige Informationen aus meiner Datenbank extrahieren und anzeigen. Mein Problem ist: Die Spalte 'fatura' (in Tabelle A) wird immer mit den 'stur'-Reihen von Multiples verknüpft (in Tabelle B). Ich kann nicht finden, wie man nicht für jede 'stur' die gleiche 'fatura' anzeigt.Wie gruppiert man Daten mit MySQL + PHP?

Mein Code:

<?php 
$mysqli = NEW MySQLi('localhost','root','','server'); 

$sqlFatura = $mysqli->query("SELECT fatura,stur 
          FROM faturas inner join anexos 
          WHERE ID_fatura = FK_fatura 
          "); 


if($sqlFatura->num_rows > 0){ 
    while($rows = $sqlFatura->fetch_assoc()){ 
     $fatura = $rows['fatura']; 
     $stur = $rows['stur'];  

     echo "<p> Fatura $fatura => Stur: $stur </p>"; 
?> 

Ergebnis jetzt:

'Fatura FT01 => Stur 01 
    Fatura FT01 => Stur 02 
    Fatura FT01 => Stur 03 
    Fatura FT02 => Stur 04 
    Fatura FT02 => Stur 05' 

sein müssen:

'Fatura FT01 => Stur 01, 02, 03 
    Fatura FT02 => Stur 04, 05 

Alle Vorschläge sind willkommen.

Vielen Dank im Voraus!

+0

, was Ihr macht 'stur' Spalte enthalten? Zeigen Sie ein oder zwei solcher Daten – 1000111

Antwort

3

Sie können versuchen, GROUP BY ID_fatura zusammen mit GROUP_CONCAT(stur) zu verwenden.

SELECT 
    fatura, 
    GROUP_CONCAT(stur) AS allSturs 
FROM 
    faturas 
INNER JOIN anexos ON ID_fatura = FK_fatura 
GROUP BY ID_fatura 

Hinweis: Da Spaltenname von stur geändert allSturs so müssen Sie die Zeile ändern, in dem Sie den Wert davon bekommen.

$stur = $rows['allSturs'];

Caution:

Vorsicht vor MySQLmax Größe für einen String-Variable und GROUP_CONCAT.

Wenn GROUP_CONCAT maximale Länge ist die Grenze (1024 standardmäßig) sollten Sie ändern Sie die temporäre Einstellung (Sitzung-Bereich) für die Länge davon. Es ist durch getan:

SET SESSION group_concat_max_len = 10000

Set group_concat_max_len permanently (MySQL config)

+0

Ich konzentrierte mich auf die PHP-Seite, Ihre Methode hat perfekt funktioniert. Das stur-Feld sind Dokumentennummern eines Prozesses. Ich habe meinen Verstand hier braten, vielen Dank für die Hilfe! –

+0

Gern geschehen. Froh, dass ich helfen konnte. – 1000111

+0

Bitte üben Sie die Antwort als ** akzeptiert **, wenn es für Sie funktioniert, damit andere es nützlich finden. [** Antwort annehmen **] (http: //meta.stackexchange.com/questions/5234/how-do-Annahme-eine-Antwort-Arbeit) – 1000111

0

Nur ein kleines Beispiel dafür, wie Sie dies mit PHP tun könnten. (musste zuerst die Arrays erstellen und dann zu einer foreach-Schleife wechseln, um Ihr Szenario korrekt wiederherzustellen)

Sie können sehen, es ist ein wenig mehr Arbeit als bei der Lösung des Problems direkt in mysql, aber vielleicht eines Tages muss so etwas verwenden. Auch habe ich das "," nach den "stur" -Nummern nicht gesetzt, das würde wieder etwas mehr Arbeit erfordern.

Sie können auch sehen, diese answer about how to break those groups into an array

$faturas = array(
array('fatura' => 'Fatura FT01', 'stur' => '01'), 
array('fatura' => 'Fatura FT01', 'stur' => '02'), 
array('fatura' => 'Fatura FT01', 'stur' => '03'), 
array('fatura' => 'Fatura FT02', 'stur' => '04'), 
array('fatura' => 'Fatura FT02', 'stur' => '05'), 
); 

$firstIteration === true; 
foreach ($faturas as $rows) { 
    if($lastFatura !== $rows['fatura']){ 
     if($firstIteration === false){ 
      echo '</p>'; 
     } 
     echo '<p>Fatura' . $rows['fatura'] . ' => Stur'; 
     $lastFatura = $rows['fatura']; 
    } 
    $firstIteration = false; 
    echo ' ' . $rows['stur']; 
}