String-Concatenation unterbrechen

CoverUnder

Mitglied
Hallo,

einmal mehr melde ich mich mit einer Schwierigkeit, bei der ich leider mal wieder nicht weiter komme.

Folgendes:
Ich habe eine MySQL-Abfrage und innerhalb dieser MySQL-Abfrage befinden sich weitere Abfragen. Vereinfacht gesagt frage ich in der äußeren/ersten Abfrage die ID ab und hole dann mittels der ID weitere Datensätze aus den inneren/weiteren Abfragen. Die inneren Tabellen enthalten meist mehrere Datensätze pro ID, die genaue Anzahl ist nicht bekannt.

PHP:
$sql  = "SELECT id FROM tabelle1";
$res = mysql_db_query($mysqldb, $sql, $mysql);
while ($row = mysql_fetch_assoc($res)) {


$sql2  = "SELECT xx FROM tabelle2 WHERE id=id";
$res2 = mysql_db_query($mysqldb, $sql2, $mysql);
while ($row2 = mysql_fetch_assoc($res2)) {

}

$sql3  = "SELECT yy FROM tabelle3 WHERE id=id";
$res3 = mysql_db_query($mysqldb, $sql3, $mysql);
while ($row3 = mysql_fetch_assoc($res3)) {

}



}

Das ist sicher nicht die sauberste/schönste Variante, aber mit Join und Co. bin ich leider noch nicht so vertraut, arbeite aber daran (:
Nun folgendes Problem:

Die inneren Abfragen (sql2 und sql3) enthalten mehrere Datensätze, die ich auslesen möchte und anhand von .= zusammensetze, da mir so die HTML Ausgabe erleichtert wird.
Aber genau dieses .= macht mir jetzt leider auch Probleme, denn:

Ich möchte aus den inneren Abfragen ja immer nur die Datensätze von der aktuellen ID aus der äußeren/ersten Abfrage abfragen. ABER: Leider werden durch das .= auch die Ergebnisse der vorherigen IDs/Abfragen angehängt.

Sprich: Die Anzahl der Ergebnisse nimmt immer weiter zu.

Da kommt dann eine solche Ausgabe zustande:

Code:
ID 1
Datensätze zu ID 1

ID 2
Datensätze zu ID 1
Datensätze zu ID 2

ID 3
Datensätze zu ID 1
Datensätze zu ID 2
Datensätze zu ID 3

Aussehen sollte es aber so:

Code:
ID 1
Datensätze zu ID 1

ID 2
Datensätze zu ID 2

ID 3
Datensätze zu ID 3

Nun fragt sich, ob man diese String-Verkettung irgendwie auch wieder unterbrechen/abschalten kann? So dass nur die Ergebnisse aus einer Abfrage verkettet werden und die vorherigen Ergebnisse nicht auch noch angehängt werden?

Ich würde mich über Tipps und Hinweise sehr freuen!

Grüße,
CoverUnder
 
Oder nimm doch einen Join, wenn du dir dabei jetzt schwer tust, ist es an der Zeit es zu lernen *g*

SQL:
SELECT a.*,b.*,c.*
FROM tabelle AS a 
LEFT JOIN tabelle2 AS b ON a.id=b.id
LEFT JOIN tabelle3 AS c ON a.id=c.id
 
Danke erstmals für die Antworten und entschuldigt bitte, dass ich erst so spät reagiere. Ich komme momentan leider kaum dazu...


Und nochmals danke für den Join-Code, habe den jetzt auf mein Script umfunktioniert und klappt - ist auf jeden Fall einfacher und codetechnisch sicher auch viel schöner und sauberer!


Aber mein Problem besteht leider nach wie vor.



PHP:
$sql = "SELECT
tabelle1.feld1,
tabelle1.feld2,
tabelle2.feld1,
tabelle2.feld2,
tabelle3.feld1,
tabelle3.feld2,
tabelle4.feld1,
tabelle4_feld2,
FROM tabelle1 AS tabelle1
LEFT JOIN tabelle2 AS tabelle2 ON tabelle1.feld1=tabelle2.feld1
LEFT JOIN tabelle3 AS tabelle3 ON tabelle1.feld1=tabelle2.feld1
LEFT JOIN tabelle4 AS tabelle4 ON tabelle1.feld1=tabelle2.feld1
ORDER by tabelle1.feld2 DESC";
$res = mysql_db_query($mysqldb, $sql, $mysql);
while ($row = mysql_fetch_assoc($res)) {
    
    
    $tabelle1_feld1;
    $tabelle2_feld2;
//    ... usw ...

//Die Tabellen 3 und 4 enthalten aber mehrere Datensätze, auf welche die Bedingung zutrifft. Damit ich all diese Werte in einer Variable hab und dann einfach in der HTML Datei aufrufen kann, dachte ich mir, dass ich sie so verkette und dann die einzelne Variable in der HTML Datei (s.u.) aufrufe:    
    
    $verkettung1 .= $tabelle3_feld1." - ".$tabelle3_feld2."<br>";
    $verkettung2 .= $tabelle4_feld1." - ".$tabelle4_feld2."<br>";

    
    include("ausgabe.html");
    
   
}


die Ausgabe-Tabelle
HTML:
<tr>
<td>tabelle1_feld1 - tabelle1_feld2:</td>
<td>verkettung1</td>
<td>verkettung2</td>
</tr>




Die Ausgabe erfolgt in Form einer Tabelle, die ich gerne nach diesem Schema h&auml;tte:

2agomq1.jpg

aber aussehen tut sie leider so:

2zr0ufa.jpg


Ich hoffe das war jetzt einigermaßen verständlich :/
 
Zuletzt bearbeitet:
Speichere 'tabelle1_feld1 - tabelle1_feld2' und vergleiche es in jedem durchgang. Wenns sich ändert, dann Setze die Verknüpfungen zurück


Oder du arbeitest bequem mit Arrays
PHP:
//Meine Testdaten (Simuliert die Werte der Abfrage)
$dbdata[] = array('A' => 'a1', 'B' => 123, 'C' => 987, 'D' => 'a');
$dbdata[] = array('A' => 'a1', 'B' => 234, 'C' => 876, 'D' => 'b');
$dbdata[] = array('A' => 'a1', 'B' => 345, 'C' => 765, 'D' => 'c');
$dbdata[] = array('A' => 'a2', 'B' => 456, 'C' => 654, 'D' => 'd');
$dbdata[] = array('A' => 'a2', 'B' => 567, 'C' => 543, 'D' => 'e');
$dbdata[] = array('A' => 'a3', 'B' => 678, 'C' => 432, 'D' => 'f');

$rows = array();
//Der foreach ist zu Testzwekcne. In deinem Code ist das der while($detail = mysql_fetch_assoc($res))
foreach($dbdata as $detail){
    $rows[$detail['A']]['col2'][] = "{$detail['B']} - {$detail['C']}";        
    $rows[$detail['A']]['col3'][] = $detail['D'];        
}

//Ausgabe
echo '<table>';
foreach($rows as $a => $row){
    $col2 = implode("<br />", $row['col2']);
    $col3 = implode("<br />", $row['col3']);
    echo "<tr><td>{$a}</td><td>{$col2}</td><td>{$col3}</td></tr>";
}
echo '</table>';


Achja, zum Verständnis. Der Array $row sieht im Beispiel dann so aus
Code:
$rows sieht nun folterdermasen aus¨
Array([a1] => Array(
            [col2] => Array(
                    [0] => 123 - 987
                    [1] => 234 - 876
                    [2] => 345 - 765
                )
            [col3] => Array(
                    [0] => a
                    [1] => b
                    [2] => c
                )
        )
    [a2] => Array(
            [col2] => Array(
                    [0] => 456 - 654
                    [1] => 567 - 543
                )
            [col3] => Array(
                    [0] => d
                    [1] => e
                )
        )
    [a3] => Array(
            [col2] => Array(
                    [0] => 678 - 432
                )
            [col3] => Array(
                    [0] => f
                )
        )
)

Ausgabe:
HTML:
<table>
  <tr>
    <td>1</td>
    <td>123 - 987<br />234 - 876<br />345 - 765</td>
    <td>a<br />b<br />c</td>
  </tr>
  <tr>
    <td>2</td>
    <td>456 - 654<br />567 - 543</td>
    <td>d<br />e</td>
  </tr>
  <tr>
    <td>3</td>
    <td>678 - 432</td>
    <td>f</td>
  </tr>
</table>
 
Vielen Dank für die rasche Reaktion!
Mit einem Ergebnis kann ich noch nicht dienen, ich versuche noch deine Lösung zu verstehen und daraus schlau zu werden (:
 
Jepp, mach das.
Meine Erfahrung hat mir gezeigt, dass es meistens einfacher ist die Strings in Arrays zu packen und erst am Schluss zu kombinieren.
 
Uff, okay. Also die Theorie habe ich, glaube ich, verstanden...

Ich speichere die Ausgabewerte in ein mehrdimensionales Array und füge das dann zu einen String mittels implode(); zusammen. Ja?

Aber was sich mir nicht ganz erschließt:

PHP:
foreach($dbdata as $detail){
    $rows[$detail['A']]['col2'][] = "{$detail['B']} - {$detail['C']}";        
    $rows[$detail['A']]['col3'][] = $detail['D'];        
}

Anstalle der foreach steht meine while. Also:

PHP:
while ($detail = mysql_fetch_assoc($res)) {
    $rows[$detail['A']]['col2'][] = "{$detail['B']} - {$detail['C']}";        
    $rows[$detail['A']]['col3'][] = $detail['D'];

Aber wie muss ich nun die beiden $rows Zeilen an meine Datenbankausgabe anpassen? Tut mir Leid, aber ich werde einfach nicht schlau daraus :/ Ich hoffe ich stelle mich gerade nicht allzu blöd an.
 
Also
$detail['A'] Das Feld für die erste Spalte. Ersetze das durch den Code der dir den Inhalt für die erste Spalte leifert.

"{$detail['B']} - {$detail['C']}" Steht für die zusammengesetzten Strings für die Spalte 2

und $detail['D'] dementsprechend als Inhalt für die dritte Spalte

Natürlich musst du da deine Werte irgendwie reinquetschen.
 
Aaaah, hat jetzt zwar eine Weile gedauert, aber mir ging ein Licht auf :) Danke für deine Geduld! Die Theorie habe ich auf jeden Fall verstanden, muss mich aber noch ein wenig in Arrays einlesen. Dann wird das in der Praxis auch funktionieren.

Damit hat sich mein Problem gelöst, würde ich sagen.
 
Zurück