tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Maniac
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
484
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CoverUnder CoverUnder ist offline Mitglied Silber
    Registriert seit
    Mar 2009
    Beiträge
    71
    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-Code:
    $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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Hi

    zeig den Code, wo du verkettest.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    Oder nimm doch einen Join, wenn du dir dabei jetzt schwer tust, ist es an der Zeit es zu lernen *g*

    Code sql:
    1
    2
    3
    4
    
    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
    CoverUnder bedankt sich. 
    Die Schweine von heute sind unsere Schnitzel von morgen!

  4. #4
    CoverUnder CoverUnder ist offline Mitglied Silber
    Registriert seit
    Mar 2009
    Beiträge
    71
    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-Code:
    $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-Code:
    <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:

    String-Concatenation unterbrechen-2agomq1.jpg

    aber aussehen tut sie leider so:

    String-Concatenation unterbrechen-2zr0ufa.jpg


    Ich hoffe das war jetzt einigermaßen verständlich :/
    Geändert von CoverUnder (22.12.11 um 09:23 Uhr)
     

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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-Code:
    //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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    $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-Code:
    <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>
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  6. #6
    CoverUnder CoverUnder ist offline Mitglied Silber
    Registriert seit
    Mar 2009
    Beiträge
    71
    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 (:
     

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  8. #8
    CoverUnder CoverUnder ist offline Mitglied Silber
    Registriert seit
    Mar 2009
    Beiträge
    71
    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-Code:
    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-Code:
    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.
     

  9. #9
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.
    CoverUnder bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  10. #10
    CoverUnder CoverUnder ist offline Mitglied Silber
    Registriert seit
    Mar 2009
    Beiträge
    71
    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.
     

Ähnliche Themen

  1. [C] Variadic Macro und "Concatenation"
    Von beuteltier im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 05.05.10, 15:32
  2. Programmfluss unterbrechen?
    Von stefan_gerhard im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 09.09.07, 13:33
  3. Prog unterbrechen
    Von Markus0007 im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 12.07.06, 11:50
  4. Programm unterbrechen
    Von jean luc im Forum Java
    Antworten: 2
    Letzter Beitrag: 08.06.04, 10:16
  5. Programm unterbrechen
    Von LJerch im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 21.08.03, 13:01