Problem mit Result Ausgabe in WHILE-Schleife

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Result Ausgabe in WHILE-Schleife

    Hi, Leute, ich habe gerade ein kleines aber unschönes Problem bei der Entwicklung eines Systems.
    Es geht ALLGEMEIN darum, dass ich aus einer SQL Tabelle 2 Dinge nacheinander abfragen möchte:
    1. eine gruppierte Liste aller Personen
    2. Eine Liste aller Aufenthaltsorte zu den Personen
    also

    Vorher: Tabelle
    ID | Name | Ort |
    1 | Max Mustermann | Ort 1
    2 | Max Mustermann | Ort 2
    3 | Max Mustermann | Ort 3
    4 | Herr Meier | Ort 3
    5 | Herr Meier | Ort 2
    6 | Herr Meier | Ort X
    7 | Herr Heinrich | Ort 2
    8 | Herr Heinrich | Ort 1


    Nachher:
    Max Mustermann: Ort 1, Ort 2, Ort 3
    Herr Meier: Ort 3, Ort 2, Ort X
    Herr Heinrich, Ort 2, Ort 1

    ---------------------------------------------------------------------------------

    Bisher habe ich es velöst indem ich folgenden Code verwendet

    PHP-Code:
    if($action=="azubi") {
    $result $db->unbuffered_query("SELECT 
    DISTINCT e.azubi, f.* 
    FROM bb"
    .$n."_events e 
    JOIN bb"
    .$n."_userfields f 
    ON e.azubi = f.userid 
    ORDER BY f.field4"
    );

    while (
    $row mysql_fetch_array($result)) {
     
    $e_vorname $row['field5'];
     
    $e_name $row['field4'];
     
    $nummer $row['azubi'];


     
    $result2 $db->unbuffered_query("SELECT 
     SUBSTRING(e.eventdate,1,4) AS year,
     SUBSTRING(e.eventdate,6,2) AS month,
     SUBSTRING(e.eventdate,9,2) AS day,
     SUBSTRING(e.eventenddate,1,4) AS endyear,
     SUBSTRING(e.eventenddate,6,2) AS endmonth,
     SUBSTRING(e.eventenddate,9,2) AS endday,
     e.*,gr.*
     FROM bb"
    .$n."_events as e
     JOIN bb"
    .$n."_groups as gr ON e.abteilung = gr.groupid
     WHERE e.azubi = 
    $nummer 
     ORDER BY year, month"
    );
    // ++++++ hier holt er die richtigen Daten, fügt aber leider die alten nachher vorn an

     
    while ($row2 mysql_fetch_array($result2)) {
       
    $e_abt $row2['title'];
     
    $start $row2['month'];
     
    $end $row2['endmonth'] ;


    // ++++++ Aufenthaltsorte sollen so oft erscheinen, wie die Person in  Monaten dort war

     
    $diffdat1=GetTimeStamp($row2['eventenddate']);
        
    $diffdat2=GetTimeStamp($row2['eventdate']);
        
    $differenz round(GetDayDiff($diffdat1,$diffdat2)/30.5,0);

     for(
    $count 1$count $differenz$count++)
        {
            
    $nummer2 $nummer;

           
            eval (
    "\$azubibit .= \"".$tpl->get("calendar_azubi_bit")."\";");
        }
         
    }
    mysql_free_result($result2);

     eval (
    "\$azubilist .= \"".$tpl->get("calendar_azubi_list")."\";");
     }
      
      
    mysql_free_result($result);
    eval(
    "\$tpl->output(\"".$tpl->get("calendar_azubi")."\");");


    ja, das ist etwas komplizierter, da das System noch mehr kann als die Allgemeine Darstellung. Aber es Funktioniert allgemein

    der FEHLER ist nur, dass es die gelisteten $e_abt nicht nur dem "azubi" zuordnet, sondern beim 2. und 3. etx. durchlauf der While schleife immer die Ergebnisse der vorhergehenden Schleife komplett VOR das eigentliche Ergebniss packt.
    Ich denke, das muss man doch irgendwie beheben können, oder?


    IST-Fehler:
    Max Mustermann: Ort 1, Ort 2, Ort 3
    Herr Meier: Ort 1, Ort 2, Ort 3, Ort 3, Ort 2, Ort X
    Herr Heinrich: Ort 1, Ort 2, Ort 3, Ort 3, Ort 2, Ort X, Ort 2, Ort 1

    SOLL:
    Max Mustermann: Ort 1, Ort 2, Ort 3
    Herr Meier: Ort 3, Ort 2, Ort X
    Herr Heinrich, Ort 2, Ort 1

    __________________
    Falls sich jemand die Mühe machen könnte, mal durchzuschauen, oder mir allgemein eine bessere Lösung für die allgemeine Problematik zu sagen, wäre ich sehr dankbar!
    Zuletzt geändert von DocValerian; 22.07.2008, 17:41.

  • #2
    Fangen wir mal schnell bei null an:

    1. eine gruppierte Liste aller Personen
    2. Eine Liste aller Aufenthaltsorte zu den Personen
    Ein JOIN wäre hier die richtige Abfrage.

    Nachher:
    Max Mustermann: Ort 1, Ort 2, Ort 3
    Herr Meier: Ort 3, Ort 2, Ort X
    Herr Heinrich, Ort 2, Ort 1
    Formatierung erfolgt über einen Gruppenwechsel.

    Das dürfte dein Problem eigentlich schon lösen.

    Dann noch ein paar rhetorische Fragen:

    1) Query in der Schleife ausführen, wie viele Personen erwartest du? Schon bei wenigen kannst du hier ganz schön überflüssige Performance schlucken.

    2) SUBSTRING(e.eventdate,1,4) AS year WTF? Die Spalten sind doch hoffentlich datetime, daher fluppt YEAR(), MONTH, ... Date- and Time-Functions mal ansehen.

    3) GetTimeStamp() Das kann MySQL ganz sicher auch. Wobei du mal prüfen solltest, ob du nicht die ganze Berechnung von MySQL machen lassen kannst.

    4) Warum heißen die Spalten eigentlich field4 statt "lastname"? und wenn sich das nicht ändern lässt, dann verwende doch nen Alias in der Query, so sparst du dir die zusätzlichen Variablen und Zuweisungen.

    5) Warum missbrauchst du eval()???

    Kommentar


    • #3
      jaaaa, ich habe leider (noch) nicht den Stein der PHP-Weisen in meinem Kopf gefunden ^^

      Vielen Dank auf jeden Fall mal für die schnelle Antwort. ich werde es gleich mal austesten.

      Ressourcen sind kein Problem bei der Sache aber ich bin natürlich stets lernwillig ^^

      P.S.: der Code ist nur ein AUSZUG eines wesentlich komplexeren Scripts. Das System hat ein paar mehr Funktionen und das Eval ist für die Backend-Templates nötig aber sollte es da auch was besseres geben ...

      Kommentar


      • #4
        Ressourcen sind kein Problem bei der Sache aber ich bin natürlich stets lernwillig ^^
        Noch sind sie kein Problem, wenn du fleißig so weiter machst, werden sie es.

        das Eval ist für die Backend-Templates nötig
        Dann sag mir doch mal bitte, warum du an den hier genannten Stellen nicht auf eval() verzichten kannst?

        Kommentar

        Lädt...
        X