Lösungsansatz um mysql tabelle gruppiert auszulesen ?

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

  • Lösungsansatz um mysql tabelle gruppiert auszulesen ?

    hallo jungs,

    ich hänge gerade fest
    leider hab ich im moment keinen besseren Threadtitel da wir ziemlich früh am morgen haben

    folgendes problem/situation:

    hab ne mysql tabelle mit folgendem inhalt

    id | name | timestamp
    -------------------------------
    1 tobi 1234
    2 mike 1235
    3 marcel 2345
    4 marco 2346
    5 frank 3456
    6 stefan 3457

    soweit sogut (sorry für die schlechte formatierung)

    jetzt möchte das gruppiert über den timestamp auslesen.
    das soll heissen, das ich die einträge mit dem tag des eintrags gruppieren will und dabei soll die tabellenfarbe wechseln
    ok ich hoffe das ist nicht zu umständlich geschrieben.. aber hier noch das beispiel was ich meine


    //Ausgelesene Tabelle:

    Name | Zeit
    ---------------
    tobi | 29.05.2008 <--Tabellenfarbe hell
    mike | 29.05.2008 <--Tabellenfarbe hell
    marcel | 30.05.2008 <--Tabellenfarbe dunkel
    marco | 30.05.2008 <--Tabellenfarbe dunkel
    frank | 31.05.2008 <--Tabellenfarbe hell
    stefan | 31.05.2008 <--Tabellenfarbe hell

    ich hoffe das ihr mich versteht

    der farbwechsel der tabelle soll also über den timestamp bestimmt werden.
    im beispiel sind nur 2 einträge pro tag angegeben wobei es natürlich weitaus mehr sein können..

    Ich hoffe Ihr könnt mir helfen, da ich echt vor einem rätsel stehe

    schonmal vielen Dank für die hilfe

    Sawyer

  • #2
    Bei einer Datenbankabfrage heisst gruppieren zusammenfassen. Im Sinne von "einem statt viele".

    Ich würde deine Gruppierung in einem Array speichern, mit dem Timestamp als Index.

    PHP-Code:
    $users = array();
    foreach (
    $rows as $row) {
        
    $users[$row['timestamp']][] = $row;
    }

    var_dump($users); 

    Was du auch machen kannst, ist einfach über die Einträge iterieren und gucken, ob der vorherige Timestamp noch der selbe ist der jetzige. Wenn nicht wechselst du die Farbe.

    PHP-Code:
    <style type="text/css">
        .
    row-highlight-background-colorhell; }
        .
    row-highlight-background-colordunkel; }
    </
    style>

    ...
    $num 0;
    $lastTS null;
    foreach (
    $rows as $row) {
        if (
    $row['timestamp'] != $lastTS) {
            
    $lastTS $row['timestamp'];
            
    $num++;
        }
        echo 
    '<tr class="row-highlight-' $num '"><td>...</td></tr>';
    }
    ... 
    Zuletzt geändert von ModestLife; 31.05.2008, 07:49.
    Mein PHP Blog

    Kommentar


    • #3
      Hallo ModestLife,

      erstmal danke für die schnelle antwort..
      aber leider brachte dein vorschlag nicht das gewünschte ergebniss

      ich habe jetzt von jedem user 5 gleiche einträge untereinander stehen ??
      und der farbwechsel ist im moment willkürlich jedenfalls erkenne ich kein muster

      ich hab es über dein zweiten lösungsansatz probiert..

      ich sollte evtl dazuschreiben, das ich die datenbank im moment ohne schnickschnack anspreche:

      PHP-Code:
      $query $db->query("SELECT * FROM users ORDER BY time DESC"); 
      also hab jetzt nix gruppiert, liegt evtl. da der fehler ?

      Danke
      Sawyer
      Zuletzt geändert von Sawyer28; 31.05.2008, 16:05.

      Kommentar


      • #4
        Also, wenn der Timestamp wirklich nur den Tag speichert (Ohne Uhrzeit), dann kommst du ganz einfach mit nem Gruppenwechsel zurecht.

        Ansonsten musst du noch date("Ymd") (oder ein SQL-Seitiges Äquivalent) darauf anwenden und anhand dessen dann den Gruppenwechsel durchführen.

        In beiden Fällen musst du der SQL-Query noch ein "ORDER BY tmestamp-Spalte" anhängen.
        Zuletzt geändert von TobiaZ; 29.06.2008, 15:46.

        Kommentar


        • #5
          hi,

          ich schwitze hier blut und wasser
          steh aber leider noch immer vor einem rätsel...

          das beispiel von ModestLife funktioniert definitiv nicht!
          bevor TobiaZ geschrieben hat, bin ich auf eine simple idee gestoßen die mich erst hat hoffen lassen, aber dann wieder eiskalt enttäuscht hat

          ich weiss das ich auf dem richtigen weg bin, aber mir gehen langsam die ideen aus, aber evtl. habt Ihr ja noch eine idee dazu.

          folgendes habe ich gemacht:

          PHP-Code:
          $farbe = array('0' => "highlight0",
                          
          '1' => "highlight1",
                          
          '2' => "highlight0",
                          
          '3' => "highlight1",
                          
          '4' => "highlight0",
                          
          '5' => "highlight1",
                          
          '6' => "highlight0"); 
          in der whileschleife hab ich mit getdate() den aktuellen tag rausgeholt
          PHP-Code:
          $datum  getdate($row['timestamp']); 
          dann einfach die class variable belegt:

          PHP-Code:
          $class $farbe[$datum['wday']]; 
          theoretisch funktioniert das auch wunderbar...
          allderdings ist die praxis nicht so wunderbar
          wenn sich z.b. am montag 1 user anmeldet und dann erst wieder einer am mittwoch, dann ist der hintergrund bei beiden "dunkel" weil bei dem array Montag => highlight1 ist und bei Mittwoch ist es genauso !!

          somit war meine Idee wieder gestorben.
          Dennoch bin ich mir sicher das es eine simple lösung gibt, und ich wäre um ein paar weitere denkanstösse evtl. mit kleinen beispielen sehr dankbar.

          @TobiaZ
          es mag an der Uhrzeit liegen, oder evtl. auch daran das ich den wald vor lauter bäumen nicht mehr sehe aber ich komme nicht drauf was du meinst bzw wie du es meinst ?
          in meinem angehängten query ist doch eine "order by xxx" vorhanden ?

          Sawyer

          Kommentar


          • #6
            Hi,

            sorry das ich den thread hier nochmal pushe, aber ich bin leider noch immer nicht weitergekommen

            hat evtl. noch jemand ne idee ?
            die bisherigen ansätze von hier haben mich leider noch nicht weitergebracht

            Danke schonmal

            Saywer

            Kommentar


            • #7
              Was genau hast du den von meinen Ansätzen versucht umzusetzen und woran scheiterst du?

              Kommentar


              • #8
                also mit den ansätzen von "ModestLife" bekomme ich ein undefinierbares ergebniss..

                die farben wechseln nach keinem bestimmten muster, deswegen kann ich dir auch nicht wirklich erklären woran ich da scheiter...

                ja und dein lösungsansatz hab ich eigentlich nicht wirklich verstanden ?
                was ich aber auch etwas weiter oben schon schrieb...
                darauf kam aber keine antwort mehr. deswegen hab ich nicht weiter nachgefragt!

                gruss

                saywer

                Kommentar


                • #9
                  Na dann wollen wir mal schauen. Du wirst doch wenigstens Sagen können, welche Variante für dich überhaupt in Frage käme

                  Also, wenn der Timestamp wirklich nur den Tag speichert (Ohne Uhrzeit), dann kommst du ganz einfach mit nem Gruppenwechesl zurecht.

                  Ansonsten musst du noch date("Ymd") (oder ein SQL-Seitiges Äquivalent) darauf anwenden und anhand dessen dann den Gruppenwechsel durchführen.
                  Zuletzt geändert von TobiaZ; 09.06.2008, 20:39.

                  Kommentar


                  • #10
                    hi,

                    also ich speicher den timestamp ohne format also quasi den reinen timestamp in der DB deswegen bin ich gerade unsicher welches deiner lösungsvorschläge in frage käme ?

                    Sawyer

                    Kommentar


                    • #11
                      Ansonsten musst du noch date("Ymd") (oder ein SQL-Seitiges Äquivalent) darauf anwenden und anhand dessen dann den Gruppenwechsel durchführen.
                      Also trifft das hier zu.

                      Du könntest jetzt als erste mal FROMUNIXTIMESTAMP und dann DATEFORMAT anwenden. Ymd bzw. %Y%m% habe ich dir ja bereits gesagt.

                      Kommentar


                      • #12
                        guten morgen,

                        erstmal sorry, aber ich musste leider nochmal weg...

                        sorry aber ich blick gerade garnicht was du mir sagen willst ich soll mit der php funktion date() in dem format date("Ymd") in die db schreiben anstelle des unixtimestamps ? ?

                        Sawyer

                        Kommentar


                        • #13
                          Ich habe jetzt hier nicht alles bis ins letzte Detail gelesen. Aber da haben wir wieder einmal jemanden, der Datum/Zeit als Integer in der Datenbank speichert, und damit freiwillig auf all die schönen Datum/Zeit-Funktionen von Mysql verzichtet. Wozu gibt es den die Datentypen DATE, TIME und DATETIME?
                          Da bleibt dir, wie von TobiaZ schon gesagt, wirklich nicht viel anderes übrig, als diesen mit FROM_UNIXTIME() umzuwandeln. Der Rest ist eine simple Gruppenbruchfunktion:
                          PHP-Code:
                          $sql "
                              SELECT
                                  name,
                                  FROM_UNIXTIME(zeit, '%d.%m.%Y') datum
                              FROM
                                  users
                              ORDER BY
                                  zeit DESC"
                          ;
                          $result db->query($sql) or exit("Fehler: " $db->error "<br />Abfrage: $sql<br />");

                          $cls = array('hell''dunkel');
                          $idx 1;
                          $datum_alt '';
                          echo 
                          "<table>\n";
                          while (
                          $row $result->fetch_assoc()){
                              if (
                          $row['datum'] != $datum_alt)
                                  
                          $idx = ($idx 1) % 2;
                                  
                          $datum_alt $row['datum'];
                              }
                              echo 
                          "<tr class='$cls[$idx]'><td>" $row['name'] . "</td><td>" $row['datum'] . "</td></tr>\n";
                          }
                          echo 
                          "</table>\n"
                          Natürlich müssen die Klassen «hell» und «dunkel» im Stylesheet oder sonst wo definiert sein.
                          Gruss
                          H2O

                          Kommentar


                          • #14
                            hi H2O,

                            sorry das ich solange nicht online war, aber ich war beruflich unterwegs.

                            erstmal vielen Dank an euch, ich werde das gleich mal testen.


                            Danke
                            Sawyer

                            Kommentar

                            Lädt...
                            X