Lösungsansatz um mysql tabelle gruppiert auszulesen ?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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>';
    }
    ... 
    Last edited by ModestLife; 31-05-2008, 06:49.
    Mein PHP Blog

    Comment


    • #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
      Last edited by Sawyer28; 31-05-2008, 15:05.

      Comment


      • #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.
        Last edited by TobiaZ; 29-06-2008, 14:46.

        Comment


        • #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

          Comment


          • #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

            Comment


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

              Comment


              • #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

                Comment


                • #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.
                  Last edited by TobiaZ; 09-06-2008, 19:39.

                  Comment


                  • #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

                    Comment


                    • #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.

                      Comment


                      • #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

                        Comment


                        • #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

                          Comment


                          • #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

                            Comment

                            Working...