Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] sql query nochmal filtern

Einklappen

Neue Werbung 2019

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

  • [Erledigt] sql query nochmal filtern

    Hallo,

    recherchiere und bastele nun schon seit 3 Std. herum.
    Könnt Ihr mir vielleicht weiterhelfen?

    Ich habe eine SQL-Tabelle von Pageviews:

    visit | day | month | year
    1 | | |
    3 | | |
    6 |28 |10 |2010
    1 |28 |11 |2010
    4 |28 |11 |2010
    2 |29 |11 |2010
    etc.
    Sind auch ein paar Leerstellen im Datum dabei.

    Ich möchte jetzt die Pageviews der letzten 31 Tage auf einer Webseite anzeigen.

    Mein Code bisher:

    Berechnet mit die Datumseinheiten:
    PHP-Code:
    <?php
    defined
    ('_JEXEC') OR defined('_VALID_MOS') OR die( "Direct Access Is Not Allowed" );

            
    $timestamp_now time(); //in [s] from January 1 1970 00:00:00 GMT (Unix Epoch) up to now (today) 
        
    $timestamp_past time()-2678400//Heute minus 31 Tage (-2678400)
        
    $datum_past date("d-m-Y",$timestamp_past); // Datum vor 1 Monat
    Liest mir die DB aus und legt mir die Einzelfelder day,month,year zu einem datum zusammen (wegen der Berechnung). Der Filter "year > 1" soll mir die Leerfelder ausfiltern. Klappt bis dahin.
    PHP-Code:
        $sql "SELECT visits, CONCAT(day,'-', month,'-',year) AS datum FROM jos_contentstats WHERE year > 1"
    Jetzt habe ich im String $sql die Felder "visits" und "datum".
    Die Leerzeilen sind weg.
    Ergebnis:
    visit | datum
    6 |28.10.2010
    1 |28.11.2010
    4 |28.11.2010
    2 |28.11.2010

    Das Problem besteht nun darin, dass ich aus $sql nur die Daten (visits) haben möchte, die > $datum_past sind.
    So:
    visit | datum
    1 |28.11.2010
    4 |28.11.2010
    2 |28.11.2010

    Garantiert falsch und da hänge ich jetzt:
    PHP-Code:
        $pageviews_filtered SUM(visits) AS summedatum WHERE datum '.$datum; 
    zugleich oder danach benötige ich die Summe der Visits:
    So:
    7

    PHP-Code:
        $result=mysql_query($pageviews_filtered);
        
    $resultmysql_fetch_array($result);
        echo 
    number_format($result["summe"], 0","".");
    ?> 
    Kann mir jemand weiterhelfen? Auch google spuckt mir nichts aus.

    Vielen, vielen Dank vorab!
    gersh

  • #2
    Wähle gleich einen vernünftigen Datentyp, anstatt das Datum in drei Spalten aufzuteilen.

    Nutze dann die Datumsfunktionen von MySQL, anstatt selbst irgendwas mit Timestamps zusammen zu basteln.

    Kommentar


    • #3
      Zitat von ChrisB Beitrag anzeigen
      Wähle gleich einen vernünftigen Datentyp, anstatt das Datum in drei Spalten aufzuteilen.
      Der Datentyp ist vorgegeben, da es sich um ein Modul handelt. Sonst müsste ich das gesamte Modul umschreiben.
      Dürfte bei meinem Kenntnisstand Jahre dauern :/

      Ich hatte schon versucht in:
      PHP-Code:
        $sql "SELECT visits, CONCAT(day,'-', month,'-',year) AS datum FROM jos_contentstats WHERE datum > .$datum_past"
      Aber bei diesem Schritt scheint datum (Zusammenführung) noch nicht angelegt zu sein.


      Grüße
      gersh

      Kommentar


      • #4
        PHP-Code:
        $sql="SELECT COUNT(visits) as besuche ,  CONCAT(day,'-', month,'-',year) AS datum 
              FROM jos_contentstats 
              WHERE datum > '"
        .$datum_past."'
              GROUP By datum
              ORDER BY datum ASC "

        :
        so aus dem stehgreif .... mit COUNT summiert er die Einträge , die durch das GROUP zusammengefasst wurden - also jeweils für jeden Tag einzeln

        vermutlich scheitert er aber schon beim größer als Vergleich beim Datum, weil es für ihn einfach eine Zeichenkette ist .... da müsstest du nun deinerseits das "Vergleichsdatum" in Tag Monat Jahr zerlegen und den Vergleich darüber machen

        Kommentar


        • #5
          Zitat von eagle275 Beitrag anzeigen
          PHP-Code:
          $sql="SELECT COUNT(visits) as besuche ,  CONCAT(day,'-', month,'-',year) AS datum 
                FROM jos_contentstats 
                WHERE datum > '"
          .$datum_past."'
                GROUP By datum
                ORDER BY datum ASC "

          :
          Hallo eagle,

          Danke für Deinen Vorschlag. Habe es eben eingebaut ... klappt leider nicht.

          Zum Einen frisst er das WHERE datum nicht (unabhängig von einem > "Wert"),
          weiterhin bleiben mit COUNT die visits leer und (lösche ich COUNT raus) fasst er mir zwar die Tage zusammen, aber mit falschen Summen.

          Geht das nicht Schritt für Schritt?
          - Erstelle query1 aus "visits", "day,month,year" zusammengefasst zu "datum" wenn "year" > 1 (das klappt zumindest) (Zeilen nur ohne Leerdatum)
          - erstelle query2 aus "visits", "datum" wenn "datum" > "akt.datum-30 Tage"
          - summiere alle (verbleibenden) "visits"
          - zeige mir summe an

          vermutlich scheitert er aber schon beim größer als Vergleich beim Datum, weil es für ihn einfach eine Zeichenkette ist .... da müsstest du nun deinerseits das "Vergleichsdatum" in Tag Monat Jahr zerlegen und den Vergleich darüber machen
          Ist doch die selbe Formatierung oder ist das falsch gedacht?
          Ich kann das "datum_past" als Sekundenwert belassen, müsste dann aber aus dem "day" "month" "year" einen Sekundenwert machen - sofern das geht.

          Grüße
          gersh

          Kommentar


          • #6
            ja ne eben NICHT

            MySQL interessiert Formatierung nicht - auch wenn eine übergebene Zeichenkette (String) so aussieht wie ein Datum (Date-Feldtyp) ist es leider für MySQL NICHT(!!!) das gleiche - obendrein .. und das ist hier noch schwerwiegender ..

            unter den "bekannten Fehlern und Problemen" ist aufgeführt, dass du selbst definierte Datenfelder NICHT in Where-klausel nehmen darfst ...(bezieht sich auf das CONCAT (.....) as datum, also dynamisch generierte Datenfelder INNERHALB eines Select)

            daher meinte ich ja , du musst den Vergleich direkt über deine Datenfelder für Tag Monat Jahr machen - und dazu dann das Vergleichsdatum auf PHP-Seite zerlegen

            Kommentar


            • #7
              OK, hab ich verstanden.

              Will mal versuchen aus den "day","month","year" einen Timestamp zu generieren (puh).

              Aber eine andere Frage:

              PHP-Code:
              $sql1 "SELECT visits,  CONCAT(day,'-', month,'-',year) AS datum 
                        FROM jos_contentstats 
                        WHERE year > 1"

              liest mir ja die Daten aus und generiert eine virtuelle Tabelle mit den Werten in Zeilen.

              Wie kann ich jetzt die Spaltenwerte "visits" und "datum" weiter veratbeiten?

              PHP-Code:
              $sql2 "SELECT visits, datum 
                      FROM '"
              .$sql1."'
                      GROUP by datum"

              scheint ja zu einfach zu sein und geht nicht.

              Gibt es da einen einfachen Lösungsweg oder wenigsten ein Stichwort, nachdem ich googeln kann? Meine bisherigen Suchversuche laufen alle ins Leere...

              Danke & Gruß
              gersh

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                vermutlich scheitert er aber schon beim größer als Vergleich beim Datum, weil es für ihn einfach eine Zeichenkette ist ....
                Das ist nicht das Problem - sind ja beides Zeichenketten, und die kann man auch auf größer oder kleiner vergleichen.

                Der Fehler ist hier das Format, in dem diese Daten verglichen werden sollen.
                Wenn man Datumsangaben als Strings vergleichen will, muss man ein Format wie YYYY-MM-DD wählen.

                Dass DD-MM-YYYY blödsinnig ist, wird klar, wenn man mal kurz drüber nachdenkt (@gersh): "05-02-2010" wäre größer als "01-10-2010".

                Edit: kleiner war falsch, größer war gemeint.

                Kommentar


                • #9
                  Zitat von ChrisB Beitrag anzeigen
                  Dass DD-MM-YYYY blödsinnig ist, wird klar, wenn man mal kurz drüber nachdenkt (@gersh): "05-02-2010" wäre kleiner als "01-10-2010".
                  Autsch ... klar logisch.
                  Wie war das mit dem Wald und den Bäumen ...
                  Danke!

                  Kommentar


                  • #10
                    ganz komisch:

                    PHP-Code:
                        $timestamp_past time()-86400//minus 31 Tage (-2678400)
                        
                    $datum date("Y-m-j",$timestamp_past); // Datum vor 1 Monat

                        
                    echo $datum
                    ergibt bei mir: 2010-12-10

                    Diese ominöse 0 am Ende bekomme ich immer, auch wenn ich nichts abziehe oder Y und j tausche...

                    Hat jemand einen Tipp bzgl. Post #7?

                    Liebguck
                    gersh

                    Kommentar


                    • #11
                      Zitat von gersh Beitrag anzeigen
                      ergibt bei mir: 2010-12-10
                      Bei mir nicht - wenn ich deinen Code 1:1 übernehme.

                      Hat jemand einen Tipp bzgl. Post #7?
                      Ja: Formuliere eine verständliche, klare Fragestellung.

                      Kommentar


                      • #12
                        Mühsam nährt sich ...

                        Bin einen Schritt weiter. Habe es geschafft die Werte day, month und year in einen Timestamp umzuformatieren.
                        PHP-Code:
                            $timestamp_past time()-2678400//minus 31 Tage 
                            
                        $datum_past date("Y-m-j",$timestamp_past); // Datum vor 1 Monat

                            
                        $sql="SELECT visits, UNIX_TIMESTAMP(CONCAT(year,'-', month,'-',day)) AS datum  
                                  FROM jos_contentstats 
                                  WHERE year > 1"

                        Nächstes Ziel ist aus dem query die Daten zu filtern, welche > $timestamp_past sind und dann die verbleibenden visits zu summieren.

                        Es hakt noch, wie ich von $sql weiter verfahre.
                        Kann mir jemand Hilfestellung geben?

                        Grüße
                        gersh

                        Kommentar


                        • #13
                          Zitat von gersh Beitrag anzeigen
                          Habe es geschafft die Werte day, month und year in einen Timestamp umzuformatieren.
                          Wozu auch immer das gut sein soll ...

                          Es hakt noch, wie ich von $sql weiter verfahre.
                          Kann mir jemand Hilfestellung geben?
                          Das ist immer noch keine konkrete Fragestellung.

                          Wenn du überhaupt nicht weißt, wie man aus PHP heraus Abfragen an MySQL sendet und das Ergebnis auswertet - dann wird's Zeit, dass du ein Tutorial durcharbeitest.

                          Kommentar


                          • #14
                            Zitat von gersh Beitrag anzeigen
                            Nächstes Ziel ist aus dem query die Daten zu filtern, welche > $timestamp_past sind und dann die verbleibenden visits zu summieren.

                            Es hakt noch, wie ich von $sql weiter verfahre.
                            Kann mir jemand Hilfestellung geben?
                            In dem du UNIX_TIMESTAMP(CONCAT(year,'-', month,'-',day)) nochmal in der WHERE Bedingung nimmst...

                            Kommentar


                            • #15
                              Hallo Mod,

                              wozu das gut war war doch bereits Thema und immerhein zeige ich wohl die Bereitschaft mich einzulesen und die Lösungen selber zu suchen. Gibt sicherlich bequemere Zeitgenossen - hm?

                              Die Fragestellung habe ich auch schon 2x gepostet, wenn vielleicht auch laienhaft.
                              Zugegeben bin ich im sql und php programmieren absoluter Nerd, hoffte jedoch hier für 10 Zeilen Code zumindest Hinweise zu erhalten mit denen ich selber rechercheiern kann.
                              Wenn es mehr als nur Quellenangaben sind, freut das mich natürlich auch und ein Danke kommt auch immer.

                              Grüße und Danke für die anderen Hinweise,
                              gersh

                              Kommentar

                              Lädt...
                              X