Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Gleiches Datum zusammenfassen / Werte in einer Zeile ausgeben

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Gleiches Datum zusammenfassen / Werte in einer Zeile ausgeben

    Hallo,

    ich habe jetzt einen ganzen Tag das WWW umgegraben und nach einer Lösung für mein Problem gesucht, leider habe ich dabei nichts gefunden was mir weiter hilft.

    Folgendes Problem
    ich habe eine Tabelle in der die Werte wie folgt abgespeichert/angezeigt werden.


    ID Datum Zeit Wert
    1 09.04.2010 10:05:46 7.22
    2 09.04.2010 14:18:11 6.38
    3 09.04.2010 18:16:14 9.55
    4 09.04.2010 19:37:12 6.77
    5 10.04.2010 05:49:00 4.83
    6 10.04.2010 07:18:53 6.55
    7 10.04.2010 09:10:07 9.33
    8 10.04.2010 10:47:53 4.88

    Das Datum wird als Varchar abgelegt, da ich es über eine CSV Datei importiere und das dort gespeicherte Datum in diesem Format vorliegt "12/25/2009" und es hier mit bei der ausgabe in die richtige Form bringe
    PHP-Code:
    $timestamp strtotime($row['SUBMISSION_DATE']); 
    $new_date date('d.m.Y'$timestamp);
    echo 
    $new_date
    Nun zu meinem eigentlichen Problem.
    Wie bekomme ich das Datum zusammen gefasst aber die Uhrzeit und die Werte aufgelistet (die ID Spielt bei der Auflistung keine Rolle)?

    09.04.2010 7.22/10:05 | 6.38/14:18 | 9.55/18:16 | 6.77/19:37
    10.04.2010 4.83/05:49 | 6.55/07:18 | 9.33/09:10 | 4.88/10:47

    Hier mal ein kleiner minidumb aus meiner sql Tabelle
    PHP-Code:
    INSERT INTO `submissions` (`id`, `wert1`, `wert2`, `wert3`, `wert4`, `wert5`, `wert6`, `wert7`, `SUBMISSION_DATE`, `SUBMISSION_TIME`) VALUES
    (14'6.38'NULLNULLNULLNULLNULLNULL'04/10/2010''19:23:13'),
    (
    15'4.83'NULLNULLNULLNULLNULLNULL'04/10/2010''21:20:35'),
    (
    22'7.22'NULLNULLNULLNULLNULLNULL'04/11/2010''14:43:35'),
    (
    27'9.33'NULLNULLNULLNULLNULLNULL'04/11/2010''18:51:52'),
    (
    31'6.22'NULLNULLNULLNULLNULLNULL'04/11/2010''22:35:56'), 
    Im Moment habe ich keinen Plan wonach ich noch suchen soll.
    Ich für einen Lösungsansatz mit einem Beispiel sehr dankbar da ich noch relativ am Anfang stehe.

    MfG
    Badaboom


  • #2
    Such mal nach "Gruppenbruch". Der sollte dir hier weiterhelfen. Müsste im Tutorial bereich zu finden sein.

    Eine rein Datenbanktechnische Lösung würde mir bei diesem Tabellenformat nicht einfallen.
    sigpic

    Kommentar


    • #3
      Im Wiki!
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Zitat von badaboom Beitrag anzeigen
        Das Datum wird als Varchar abgelegt,
        Das solltest du als erstes ändern.
        Verwende einen der Datumstypen, die die Datenbank bereitstellt.

        da ich es über eine CSV Datei importiere und das dort gespeicherte Datum in diesem Format vorliegt "12/25/2009" und es hier mit bei der ausgabe in die richtige Form bringe
        Dann kannst du es auch beim Einfügen in die Datenbank ins dafür geeignete Format bringen.

        Kommentar


        • #5
          So gehts, allein über SQL und auch direkt in der gewünschten Syntax wie oben angegeben:

          Code:
          SELECT
              SUBMISSION_DATE,
              GROUP_CONCAT(
                  wert1, '/', SUBMISSION_TIME
                  ORDER BY SUBMISSION_TIME ASC
                  SEPARATOR ' | '
              ) AS zusammenfassung
          FROM `submissions`
          GROUP BY SUBMISSION_DATE
          ORDER BY SUBMISSION_DATE ASC
          Die Ausgabe bei dem Beispieldatensatz wäre dann:
          Code:
          SUBMISSION_DATE  zusammenfassung
          '04/10/2010'     '6.38/19:23:13 | 4.83/21:20:35'
          '04/11/2010'     '7.22/14:43:35 | 9.33/18:51:52 | 6.22/22:35:56'
          EDIT: Oder, als einzelne Ergebnisspalte:
          Code:
          SELECT
              CONCAT(
                  SUBMISSION_DATE,
                  ' ',
                  GROUP_CONCAT(
                      wert1, '/', SUBMISSION_TIME
                      ORDER BY SUBMISSION_TIME ASC
                                   SEPARATOR ' | '
                  )
              ) AS zusammenfassung
          FROM `submissions`
          GROUP BY SUBMISSION_DATE
          ORDER BY SUBMISSION_DATE ASC
          Sieht dann so aus:
          Code:
          zusammenfassung
          '04/10/2010 6.38/19:23:13 | 4.83/21:20:35'
          '04/11/2010 7.22/14:43:35 | 9.33/18:51:52 | 6.22/22:35:56'
          EDIT 2: Das ORDER-BY SUBMISSION_DATE führt natürlich nen Stringvergleich durch. Ordentlich nach Datum sortieren kann man wohl nur, wenn man DATE als Datentyp benutzt.

          Du solltest dem Ratschlag von ChrisB also ruhig folgen; du erreichst damit einerseits, dass die Tabelle weniger Speicher verbraucht, andererseits sind die SQL-Abfragen flotter und du erreichst sehr viel mehr Flexibilität/Funktionalität.

          Mit DATE_FORMAT() kannst du den DATE-Datentyp dann auch in deine eigene Stringdarstellung umwandelnt; Also alles was von der Standard-Darstellung Jahr-Monat-Tag abweicht. Einfach mal ins Manual schauen.

          Kommentar


          • #6
            So, dann melde ich mich mal wieder

            Erst mal Danke für die Antworten.

            Leider bin ich noch nicht sehr viel weiter gekommen
            Ich habe mich letzte nacht daran gesetzt die Datenbank neu anzulegen und mir ein Script geschrieben welches mir die CSV-Datei importiert so wie ich es haben möchte, dabei habe ich mir das Posting von ChrisB zu Herzen genommen und die Datumskonvertierung mit eingebaut (hatte vorher nur ein fertiges Script von irgend einer anderen Seite genommen welches die Werte ohne wenn und aber in die Tabelle "gekloppt" hat).

            Nun habe ich mich versucht über den so genannten "Gruppenbruch" schlau gemacht und sehr viele Beiträge dazu durchstöbert.

            Raus gekommen ist dabei folgendes:
            PHP-Code:
            $sql "SELECT *
                    FROM `werte` GROUP BY datum ORDER BY datum ASC "

            $result mysql_query($sql);

            $elements =  (mysql_num_rows ($result));
             
            if (
            $elements) {
                echo 
            '<table border=\"1\">';
                while (
            $elements) {
                    echo 
            '<tr>';
             
                    
            // drei Elemente am Stück auslesen und ausgeben
                    
            for ($index 0$index 1$index++) {
                        
            // keine weiteren Elemente
                        
            if (false === $set mysql_fetch_assoc ($result)) {
                            
            // Verhindert weiterlaufen der äußeren Schleife
                            
            $elements false;
                            
            // vorzeitiger Abbruch der For-Schleife
                            
            break;
                            }
             
                        echo 
            '<td>' $set['datum'] . '</td><td>' $set['bz'] . '<br>' $set['zeit'] . '</td>';
                        }
             
                    echo 
            '</tr>';
                    }
                
                echo 
            '</table>'
            Die SQL-Tabelle sieht jetzt so aus
            Code:
            INSERT INTO `werte` (`id`, `bz`, `bz1`, `bz2`, `bz3`, `text`, `zeit`, `datum`) VALUES
            (134, '5.38', '', '', '', '', '07:57:29', '2010-04-25'),
            (133, '5.99', '', '', '', '', '02:43:45', '2010-04-25'),
            (132, '10.21', '', '', '', '', '22:00:44', '2010-04-24'),
            (131, '10.93', '', '', '', '', '21:59:06', '2010-04-24'),
            (130, '14.04', '', '', '', '', '20:48:11', '2010-04-24'),
            (129, '13.27', '', '', '', '', '17:05:41', '2010-04-24'),
            Das Datum wird jetzt gruppiert allerdings wird nur der erste Wert der Spalte "bz" und "zeit" ausgegeben.
            Ich hatte es auch schon so, das nur ein Datum ausgegeben wird, dafür aber dafür alle "bz" und "zeit" werte für dieses Datum.
            Also entweder / oder
            Wenn mein Gedankengang richtig ist, müsste ich eine zweite Schleife einbauen die nach der Ausgabe des Datum die "bz" & "zeit" Werte abruft und ausgibt bevor das nächste Datum in einer neuen Zeile ausgegeben wird.
            Leider habe ich keinen Schimmer wo ich die zweite Schleife einfügen muss damit es zum gewünschten Ergebnis führt.
            Könntet ihr mir bitte noch einmal Tipp´s/Vorschläge unterbreiten?

            MfG Badaboom

            So langsam bin ich der Meinung das ich in Sachen PHP "Bildungsresistent" bin weil ich die Zusammenhänge nicht sehe bzw. Verstehe.

            Kommentar


            • #7
              Also dann wollen wir deine Mühe mal nicht lumpen und dir ein bisschen weiter helfen. Ich weiß nicht wie deine HTML-Tabelle im Anschluss genau aussehen soll, aber ich bin der Meinung, deine Umsetzung des Gruppenbruches sieht ein wenig komisch aus ^^.

              Hier mal ein kleiner Ansatz

              PHP-Code:
              <table>
                <tr>
                  <th>Datum</th>
                  <th>BZ1</th>
                  <th>Zeit</th>
                </tr>
                <?php
                $sql 
              "SELECT * FROM `werte` ORDER BY `datum`, `zeit`"
                
              $result mysql_query($sql) or die(mysql_error());

                
              $datum '';
                while(
              $set mysql_fetch_assoc($result)) {
                  
              ?>
                    <tr>
                      <td>
                        <?php 
                        
              if ($datum == $set["datum"]) {
                          echo 
              '&nbsp;';
                        } else {
                          echo 
              $set["datum"];
                        }
                        
              ?>
                      </td>
                      <td><?php echo $set["bz"]; ?></td>
                      <td><?php echo $set["zeit"]; ?></td>
                    </tr>
                  <?php $datum $set["datum"]; ?>
                <?php
                
              }
                
              ?>
              </table>
              sigpic

              Kommentar


              • #8
                Hallo Frank,
                danke für deine Antwort und deine Lösung.
                deine Umsetzung des Gruppenbruches sieht ein wenig komisch aus ^^
                Der Meinung bin ich auch, deswegen wendete ich mich erneut an euch



                MfG
                Badaboom

                Kommentar

                Lädt...
                X