kostenloser Webspace werbefrei: lima-city


Schwierige MySQL Abfrage PHP

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    paddy-herrmy

    Kostenloser Webspace von paddy-herrmy

    paddy-herrmy hat kostenlosen Webspace.

    Hallo limanianer,

    Ich hab mal wieder ein tag/problem">Problem, bei dem ich einfach auf keinen Grünen Zweig komme..
    Folgendes,
    Ich habe eine MySQL-Tabelle, an der ich nicht verändern kann.

    Die Abfrage ist folgende:
    $result = mysql_query("SELECT * FROM `tabelle`", $verbindung);
        while($obj = mysql_fetch_object($result)){
        $message = $obj->message;
    	$playerid = $obj->playerid;
    	$date = "$obj->date";
    
    echo "$message<br>";
    
    }


    das Problem ist nun, dass die Spalte "date" immer einträge mit folgender Formatierung hat:
    "2012-08-10 23:34:18"

    Kann ich nun die Ausgabe so sortieren, dass NUR Werte von einem bestimmten Tag ausgegeben werden? Und wenn ja, wie?
    Ich könnte ja den Datestring via regex zerlegen, aber weiter komme ich nicht, wie ich dass dann inerhalb der while schleife filtern soll?

    Danke schonmal für eure Hilfe :-)


    Beitrag zuletzt geändert: 13.9.2012 16:52:36 von paddy-herrmy
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. paddy-herrmy schrieb:
    das Problem ist nun, dass die Spalte "date" immer einträge mit folgender Formatierung hat:
    "2012-08-10 23:34:18"

    Das Format ist ganz normal für eine DATETIME-Spalte. Formatieren kannst du die Ausgabe mit DATE_FORMAT.


    Kann ich nun die Ausgabe so sortieren, dass NUR Werte von einem bestimmten Tag ausgegeben werden? Und wenn ja, wie?
    Ich könnte ja den Datestring via regex zerlegen, aber weiter komme ich nicht, wie ich dass dann inerhalb der while schleife filtern soll?

    Besser als da irgendwas zu zerlegen, ist die Abfragemenge zu begrenzen. Dafür benutzt man WHERE.
    Bei dir wäre das:
    WHERE DATE(Datumspalte) = 'gewünschter_Tag'

    Setzt du für gewünschter_Tag jetzt 2012-09-10 ein, werden alle Datensätze für gestern ausgegeben.

    Die Doku für alle Datumsfunktionen: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

    Beitrag zuletzt geändert: 11.9.2012 2:45:48 von chatter
  4. Autor dieses Themas

    paddy-herrmy

    Kostenloser Webspace von paddy-herrmy

    paddy-herrmy hat kostenlosen Webspace.

    chatter schrieb:
    Das Format ist ganz normal für eine DATETIME-Spalte. Formatieren kannst du die Ausgabe mit DATE_FORMAT.


    Seeehr Gut :-)
    Ich danke für die schnelle Hilfe.

    Ok, mit DATETIME hab ich noch nie gearbeitet und somit war ich mir diesser Funktion überhauptnicht bewusst, aber nun erleichtert mir das so einiges..
    Vielen Dank :-)

    **EDIT**


    Habe durch diesse neue Funktion bin ich nun weiter, und hänge schon wieder fest^^

    SELECT * FROM `tabelle` WHERE `message` != '/RTPING' AND `message` != '/' GROUP BY DAY (date)


    ich möchte also dass pro tag nur eine Spalte ausgegeben wird.
    Nun habe ich aber das Problem, dass insgesammt nur höchstens 31 Tage ausgegeben werden..
    Wie mache ich dass, dass er beim ende eines Monats, wieder von vorne im nächsten monat weiterzählt?

    Danköö :-)

    Beitrag zuletzt geändert: 13.9.2012 16:54:23 von paddy-herrmy
  5. nochmal zu Auslesen:
    um Einträge mit Datum aus bestimmten Monat ( in bestimmten Jahr) zu finden
    wäre wohl eine Möglichkeit ... wenn Du Deine Datenbank-Struktur etwas änderst,
    und anstatt von (oder zusätzlich zum) DATETIME als ganzes Datum,
    jeweils nur Tag (date_day), Monat (date_month) und Jahr (date_year) in einzelne Spalten speicherst

    dann kannst Du Anfragen machen wie

    ... SELECT * FROM `tabelle` WHERE date_year = '2012' AND date_month = '09' ...


    oder .. ohne Daten-Struktur-Änderung
    ... Du erstellst Dir vor der Abfrage die zwei Datums-Grenzen
    (von Monats-Beginn bis Monats-Ende) als Datum-String
    und damit kannst Du dann eine Abfrage mit BETWEEN machen

    $von_datum = '2012-09-01'; 
    $bis_datum = '2012-09-31'; 
    
    $sql = "SELECT * FROM `tabelle` WHERE date BETWEEN '$von_datum' AND '$bis_datum' ";


    oder ... eventuell "besser"" ... mit MySQL Datums-Funktionen in der Abfrage
    $sql = "SELECT * FROM `tabelle` WHERE month(date) = '09' AND year(date)= '2012' ";


    alle Möglichkeiten siehe hier: MySQl Date and Time Functionsl


    oder als String behandeln und mit LIKE ?!? .. z.B. alles im September 2012

    SELECT * FROM  `tabelle` WHERE date LIKE '20112-09-%'


    aber ob das geht (und gut ist) kann ich nicht sagen ...

    Wichtig ist halt, dass Du das richtige Datum-Format in den Daten hast: YYYY-mm-dd HH:ii:ss
    also mit PHP:
    $datum = date('Y-m-d H:i:s');
    zum Speichernn in die Spalte 'date'
    also nicht das "deutsche" Datums-Format sondern US-Format (bzw. das MySQL Standard-Format)


    zu den anderen Fragen:

    paddy-herrmy schrieb:
    ich möchte also dass pro tag nur eine Spalte ausgegeben wird.


    meinst Du jetzt damit nur eine Daten-Zeile aus der Tabelle
    oder in der Ausgabe der Daten ??? ... dabei hilft ja das
    GROUP BY DAY (date)


    in Ausgabe mit PHP (in der while-Schleife) ginge es vielleicht mit date_parse()
    dann kannst Du Die Ergebnisse in Array pro Tag legen und do ausgeben

    $ergebnis = array(); 
    while($obj = mysql_fetch_object($result)){
    
        $fulldate = $obj->date;
        $date_parts = date_parse($fulldate); 
        
        $jahr = (int)$date_parts['year']; 
        $monat = (int)$date_parts['month']; 
        $tag = (int)$date_parts['day']; 
    
    $ergebnis[$jahr][$monat][$tag][] = array ( 
       'message' => $obj->message , 
       'playerid' => $obj->playerid , 
       'fulldate' => $fulldate 
    ); 
    
    }
    
    print "<br>DEBUG Ausgabe: \n"; 
    print "<pre>\n"; 
    print_r($ergebnis); 
    print "</pre>\n";


    Dann kannst Du mit foreach() die Elemente aus dem $ergebnis Array ausgeben
    gestaffelt nach Jahr, Monat, Tag (in den Array-Ebenen)

    also z.B. alle Tage im August 2012
    // ----- Start --- Schleife Tage --- 
    foreach($ergebnis[2012][8] as $dkey => $item) { 
    
    echo "<br />------------- Tag: ".$dkey."-------------\n"; 
    
       $n=1; 
      // ----- Start --- Schleife Daten --- 
       foreach($item as $daydata) { 
          echo "<br />-------- Nr: ".$n."--------\n"; 
          echo "<br />".$item['playerid']."\n"; 
          echo "<br />".$item['message']."\n"; 
      $n++; 
      }
      // ----- Ende --- Schleife Daten --- 
    
    }
    // ----- Ende --- Schleife Tage ---



    oder alle Ergebnisse für den 11.09.,2012
    $n=1; 
    // ----- Start --- Schleife Daten --- 
    foreach($ergebnis[2012][9][11] as $item) { 
       echo "<br />-------- Nr: ".$n."--------\n"; 
       echo "<br />".$item['playerid']."\n"; 
       echo "<br />".$item['message']."\n"; 
    $n++; 
    }
    // ----- Ende --- Schleife Daten ---



    oder halt doch gleich in der MySQL Abfrage
    also .... gleich Tag, Monat und Jahr auslesen und in "neue" Variable ablegen

    SELECT *, DAY(date) as tag, MONTH(date) as monat, YEAR(date) as jahr FROM  `tabelle` WHERE .....

    aber ich weiss nicht ob man nach dem * noch weitere Werte mit Komma angeben kann
    sonst halt so
    SELECT message, playerid, date, DAY(date) as tag, MONTH(date) as monat, YEAR(date) as jahr FROM  `tabelle` WHERE .....


    keine Ahnung ob das so funktioniert, wäre wohl geschickter
    denn dann könntest Du dir das date_parse() in der while() Schleife sparen
    und hättest direkt aus der Abfrage die "neuen" Variablen (bzw. als Objekte) ....

    ... uff .. schwere Geburt dieser Beitrag, aber hoffe es hilft :)


    Beitrag zuletzt geändert: 11.9.2012 14:55:25 von sportinfo
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!