MySQL Abfrage umsortiert in Tabelle ausgeben

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

  • MySQL Abfrage umsortiert in Tabelle ausgeben

    Moin, moin.

    Ich habe eine Tabelle in einer Datenbank mit folgenden Einträgen:
    Code:
    ID |    Datum   | Gruppe | Fahrzeug   | Sonderdienst
     2 | 11.01.2010 |    1   | LF 16      | 
     3 | 11.01.2010 |    2   | Wache      | 
     4 | 25.01.2010 |        |            | Erste Hilfe
     5 | 29.01.2010 |    2   | DLK        | 
     6 | 08.02.2010 |    1   | RW2        | 
     7 | 08.02.2010 |    2   | LF 16      | 
     8 | 08.02.2010 |    3   | DLK        |
    Das ganze möchte ich dann als HTML Tabelle in der Form darstellen:

    Code:
    Datum      | Grp 1 | Grp 2 | Grp3
    11.01.2010 | LF 16 | Wache | ----
    25.01.2010 |      Erste Hilfe
    29.01.2010 | ----  | DLK   | ----
    08.02.2010 |  RW2  | LF 16 | DLK
    So ziehe ich mir die Daten in ein Object ($row):
    PHP-Code:
    SELECT a.ida.datuma.gruppea.fahrzeuga.sonderdiensta.specialb.id as grp_idb.bezeichnung
        FROM 
    `vuis_dienstplaene` AS a
        LEFT JOIN 
    `vuis_gruppen` AS b
        ON b
    .id a.gruppe
        WHERE 
    `datum` >= \"".$jahr."-01-01\" and `datum` <= \"".$jahr."-12-31\" ORDER BY `datum` asc, `gruppe` asc 

    Mein Problem sind nun diese Sonderdienste sowie das Umsortieren der einzelnen Datenbankzeilen.


    Mit folgendem Ansatz habe ich es bereits probiert:

    PHP-Code:
    if(isset($last_dat) and $row->datum <> $last_dat OR $data["6"] <> ''){ // Bedingung wird bei jedem Datumswechsel erfüllt

        
    for ($gr=1$gr<=6$gr++){  // Wenn im $daten[$gr] noch nichts eingetragen wurde (kein Eintrag für
            
    if (!isset($data[$gr])){ // Gruppe vorhanden), soll es auf "leere Zelle" gesetzt werden
                
    $data[$gr] = "<td>&nbsp;</td>";
            }
        }

        echo 
    "<tr>
                <td align=\"center\" width=\"90\" height=\"30\">"
    .datum_to_de($last_dat)."</td>
                
    $data[1] $data[2] $data[3] $data[4] $data[5] $data[6] 
            </tr>"
    ;
        unset(
    $data);

    }
      
    $data[$row->gruppe] = "<td align=\"center\" style=\"background-color:".$bg_color.";\" width=\"90\">".$text.$edit."</td>\n";
    $last_dat $row->datum


    // Übrig gebliebene:
    echo "<tr>
            <td align=\"center\" width=\"90\" height=\"30\">"
    .datum_to_de($row->datum)."</td>
            
    $data[1] $data[2] $data[3] $data[4] $data[5] $data[6] 
        </tr>"

    Wenn man die Sonderdienste weglässt, funktioniert es so ganz prima.
    Sobald aber ein Dienstabend aus der Reihe tanzt, klappt es mit der "Datums-Wechselbedingung" nicht mehr. Dann verschiebt sich alles.

    Vor der Ausgabe wird übrigens per If überprüft ob es ein normaler oder ein Sonderdienst ist.

    Hat jemand eine Idee oder einen anderen Ansatz wie ich das mit dem Umformen bewerkstelligen kann?
    Oder soll ich was an der DB Struktur ändern?

    MfG
    Androxin

    PS: Ich hoffe, dass meine Codeauszüge so reichen. Wenn nicht, kann ich auch noch mehr aus meiner Datei posten/erklären.


    Vielen Dank schon mal :-)

  • #2
    Klingt für mich nach einem klassischen Gruppenwechsel, siehe http://www.php-resource.de/forum/blo...chsel-php.html


    Und bitte brich den Code um, zur Seite scrollen macht keinen Spass..

    Kommentar


    • #3
      Zitat von medium22 Beitrag anzeigen
      Klingt für mich nach einem klassischen Gruppenwechsel, siehe http://www.php-resource.de/forum/blo...chsel-php.html


      Und bitte brich den Code um, zur Seite scrollen macht keinen Spass..
      Hehe

      Bei mir verschwindet nur das "\n";" aus Zeile 17. Hatte gedacht, dass das so Okay ist.


      Grundsätzlich ist dein Hinweis auf den Gruppenwechsel schon mal Gold wert. Nur weiß ich noch nicht so recht, wie ich das Wissen auf mein Problem übertragen kann.
      Ich brauche da wohl mal jemanden, der mich von meinem Schlauch runter schuppst ;-)

      Kommentar


      • #4
        z.B. so
        PHP-Code:
        $sql '
            SELECT
                a.id, a.datum, a.gruppe, a.fahrzeug, a.sonderdienst, a.special,
                b.id as grp_id, b.bezeichnung
            FROM
                `vuis_dienstplaene` a
            LEFT JOIN
                `vuis_gruppen` b ON b.id = a.gruppe
            WHERE
                `datum` BETWEEN date_format(NOW(), "%Y-01-01") AND date_format(NOW(), "%Y-12-31")
            ORDER BY
                `datum` ASC,
                `gruppe` ASC
        '
        ;

        $data = array();
        while (
        $row mysql_fetch_assoc($deinResult)) {
            if (!empty(
        $row['sonderdienst'])) {
                
        $value $row['sonderdienst'];
            }
            else {
                
        $value $row['fahrzeug'];
            }

            
        $data[$row['datum']][$row['gruppe']] = $value;
        }

        foreach (
        $a as $row) {
            if (!empty(
        $row['sonderdienst'])) {
                
        $value $row['sonderdienst'];
            }
            else {
                
        $value $row['fahrzeug'];
            }

            
        $data[$row['datum']][$row['gruppe']] = $value;
        }

        $assign = array();
        $dayData = array();
        $tmp = array();

        if (
        count($data)) {
            foreach (
        $data as $date => $groupData) {
                
        $dayData = array('datum' => $date);

                foreach (
        $groupData as $groupName => $vehicle) {
                    
        $tmp = array('group' $groupName => $vehicle);
                    
        $dayData array_merge($dayData$tmp);
                    
        $tmp = array();
                }

                
        $assign[] = $dayData;
            }
        }

        // output
        echo "Datum\t\tGruppe1\t\tGruppe2\t\tGruppe 3\n";

        foreach (
        $assign as $row) {
            if (isset(
        $row['group'])) {
                echo 
        $row['datum'] . "\t===============" $row['group'] . "===============\n";
            } else {
                echo 
        $row['datum'] . "\t" $row['group1'] . "\t\t" $row['group2'] . "\t\t" $row['group3'] . "\n";
            }

        Output in der Konsole:

        Datum Gruppe1 Gruppe2 Gruppe 3
        11.01.2010 AAA BBB
        25.01.2010 ===============Erste Hilfe===============
        29.01.2010 asdfasdf
        08.02.2010 CCC DDD EEE

        Eine abstraktere Datenstruktur wäre ratsam. Dann kann sich das jonglieren mit den Arrays sparen oder verkürzen.
        Zuletzt geändert von xManUx; 19.12.2010, 05:08.

        Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
        sondern mit den Augen das Manual zu lesen.

        Kommentar


        • #5
          xManUx!

          Vielen, vielen Dank!

          Du hast mich gerettet!

          Problem gelöst.


          Eine Frage habe ich aber noch:
          Wozu dient diese foreach?

          PHP-Code:
          foreach ($a as $row) {
              if (!empty(
          $row['sonderdienst'])) {
                  
          $value $row['sonderdienst'];
              }
              else {
                  
          $value $row['fahrzeug'];
              }

              
          $data[$row['datum']][$row['gruppe']] = $value;


          Und für die Nachwelt:
          Einen Fehler habe ich noch gefunden:

          Es muss "group0" und nicht "group" heißen:
          PHP-Code:
          foreach ($assign as $row) {
              if (isset(
          $row['group0'])) {
                  echo 
          $row['datum'] . "\t===============" $row['group0'] . "===============<br>";
              } else {
                  echo 
          $row['datum'] . "\t" $row['group1'] . "\t\t" $row['group2'] . "\t\t" $row['group3'] . "<br>";
              }

          Kommentar


          • #6
            Zitat von androxin Beitrag anzeigen
            xManUx!
            Eine Frage habe ich aber noch:
            Wozu dient diese foreach?
            PHP-Code:
            foreach ($a as $row) {
                if (!empty(
            $row['sonderdienst'])) {
                    
            $value $row['sonderdienst'];
                }
                else {
                    
            $value $row['fahrzeug'];
                }

                
            $data[$row['datum']][$row['gruppe']] = $value;

            Damit machst Du ein Lookup und gewährst dem Sonderdienst gegenüber dem Fahrzeug den Vortritt. So wie das interpretiert habe, kann kein Fahrzeug dargestellt werden, wenn ein Sonderdienst stattfindet, weil ein Sonderdienst für alle Gruppen gilt.

            Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
            sondern mit den Augen das Manual zu lesen.

            Kommentar


            • #7
              aber passiert nicht genau das in der while Schleife:

              PHP-Code:
              while ($row mysql_fetch_assoc($deinResult)) {
                  if (!empty(
              $row['sonderdienst'])) {
                      
              $value $row['sonderdienst'];
                  }
                  else {
                      
              $value $row['fahrzeug'];
                  }

                  
              $data[$row['datum']][$row['gruppe']] = $value;

              Kommentar

              Lädt...
              X