ralphi: delete und min?

Hi Leute,

folgendes SQL Problem:

Ich möchte gerne einen Datensatz aus einer Tabelle löschen deren Datenwert (Zeit) am niedrigsten (also am ältesten ) ist.

Die Befehle habe ich bereits beim MySql server ausprobiert:
DELETE FROM tabelle WHERE zeit = (MIN (Zeit))
DELETE FROM tabelle WHERE zeit = MIN (Zeit)
DELETE FROM tabelle WHERE zeit = MIN ('Zeit')
DELETE FROM tabelle WHERE MIN Zeit
DELETE FROM tabelle WHERE MIN (Zeit)
DELETE FROM tabelle WHERE Zeit = SELECT MIN (Zeit) FROM tabelle
DELETE FROM tabelle WHERE Zeit = SELECT MIN (Zeit)
usw.
etweder tut er gar nichts oder er sagt funktion tabelle.MIN nicht bekannt.

Sagt mir jemand was ich falsch mache?

Kurz zu dem was ich mache. Mit einem Datenlogger lese ich mit VB Werte von Solarzellen aus. Um einen örtlich unabhängigen Blick drauf zu haben, möchte ich gerne eine Tabelle (neben der Haupttabelle) mit den aktuell letzten 30 Messwerten füttern, die ich dann als Diagramm unter PHP darstellen möchte - (www.Asial .de). Dazu möchte ich von den 30 Werten den Ältesten löschen und den aktuellen Einpflegen. Also ein Fenster auf den laufenden Datenfluß haben.

Grüße ralphi

  1. Hi,

    folgendes SQL Problem:

    Welches DBMS?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi Chris,

      DBMS? - Ich habe xampp mit mysql und phpmyadmin - die DB heist 'solar' und die Tabelle 'akt1' - die Spalten: 'zeitsec' (zb.'10:15:02') 'wertsec' (zb. 120) und 'maxsec' (zb.300) brauch ich fürs Diagramm.
      Davon 30 Datensätze.

      Testen tu ich unter registerkarte bei phpmyadmin 'sql'
      Die Datensätze habe ich zum test einfach so eingegeben:

      $zeit= strtotime("12:00:00");
      $i = 1;
      while ($i < 31) {
      $zeitsec = date('h:i:s',  mktime(date('h', $zeit), date('i', $zeit),  date('s', $zeit) + $i));
      mysql_query(sprintf('insert into test.akt1 (zeitsec, wertsec, maxsec) VALUES ("%s", "100", "20")',
      addslashes($zeitsec) ) );
      $i++;
      };

      grüße ralphi

      Hi,

      folgendes SQL Problem:

      Welches DBMS?

      MfG ChrisB

      1. Hi,

        DBMS?

        Database Management System.

        • Ich habe xampp mit mysql

        Dann kannst du einfach ORDER BY und LIMIT dafür benutzen.

        DELETE FROM tabelle ORDER BY zeit ASC LIMIT 1

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hi,

          DELETE FROM tabelle ORDER BY zeit ASC LIMIT 1

          klappt prima - danke. - bis auf die sache, das ich bei 13:00:00 den Wert 01:00:00 bekomme (ohne AM/PM) was beim ORDER BY wichtig wäre.
          die spalte zeit ist als 'time' festgelegt. gibt es einen anderen typ mit 24h? - ich finde in der auswahl keinen nur:
          date, datetime, timestamp, time, year

          ralphi

          1. Hi,

            klappt prima - danke. - bis auf die sache, das ich bei 13:00:00 den Wert 01:00:00 bekomme (ohne AM/PM) was beim ORDER BY wichtig wäre.
            die spalte zeit ist als 'time' festgelegt.

            Dann hast du den Wert vermutlich schon falsch eingetragen - TIME hat jedenfalls kein Problem, auch Werte jenseits 12 Uhr zu beinhalten.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          2. Tach!

            klappt prima - danke. - bis auf die sache, das ich bei 13:00:00 den Wert 01:00:00 bekomme (ohne AM/PM) was beim ORDER BY wichtig wäre.

            Wenn ich mal rate, dass du diese Stelle gemeint haben könntest:

            $zeit= strtotime("12:00:00");
              $i = 1;
              while ($i < 31) {
                $zeitsec = date('h:i:s',  mktime(date('h', $zeit), date('i', $zeit),  date('s', $zeit) + $i));
                mysql_query(sprintf('insert into test.akt1 (zeitsec, wertsec, maxsec) VALUES ("%s", "100", "20")',
                  addslashes($zeitsec) ) );
                $i++;
              };

            Kann eigentlich nicht sein, denn damit kommst du nicht auf 13 Uhr. Aber abgesehen davon - wofür steht bei date() der Buchstabe h genau?

            Und was ist das für ein abenteuerliches Konstrukt? Wenn du genau weißt, von wo bis wo deine Schleife laufen soll, nimm lieber for, da hast du alle drei laufzeitbestimmenden Dinge schön übersichtlich in einer Zeile.

            Die $zeitsec-Zeile kann man sicher noch viel umständlicher schreiben. Einfacher ist es jedoch, zur sowieso schon in Sekunden vorliegenden Zeit einfach nur die $i Sekunden zu addieren und diese neue Sekundenanzahl zu formatieren.

            addslashes() ist nicht direkt falsch, aber auch nicht für MySQL vorgesehen sondern mysql_real_escape_string(). In diesem Fall brauchst du es jedoch gar nicht, weil das Ergebnis der date()-Funktion bei dem gegebenen Formatierstring keine für das Escaping relevanten Zeichen zurückgibt. Schaden kann ein (nutzloses) Escapen allerdings auch nicht.

            die spalte zeit ist als 'time' festgelegt. gibt es einen anderen typ mit 24h? - ich finde in der auswahl keinen nur:
            date, datetime, timestamp, time, year

            Die Zeitspalten speichern ihren Wert unabhängig von einer irgendwie gearteten Formatierung. Wenn du also 01 statt 13 bekommst, hast du was bei der Formatierung falsch gemacht.

            dedlfix.

            1. Hi Leute vielen Dank für die vielen Infos,

              leider watscht mich, meine beständige Faulheit beim Programmieren immer wieder ab, wenns darum geht alten code zu modifizieren.
              Ich hab selten, wenn ich was übernommen habe, gefragt was es ist, wie es funktioniert und warum eigentlich.

              übrigens - das kommische Konstruckt hab ich von php.net (Bsp):
                 $zeitsec = date('h:i:s',  mktime(date('h', $zeit), date('i', $zeit),  date('s', $zeit) + $i));
                  mysql_query(sprintf('insert into test.akt1 (zeitsec, wertsec, maxsec) VALUES ("%s", "100", "20")',
                    addslashes($zeitsec) ) );

              hier muss auch der Fehler sein, weil, wenn ich mit VB die tabelle erzeuge und fülle klappt alles:

              ' DB - öffnen
              Dim sql, t As String
              Set conn2 = New ADODB.Connection
              conn2.Open "sol_server"
              Set rs2 = New ADODB.Recordset
              sql = "CREATE TABLE akt1 (id    integer not null primary key auto_increment, zeitsec   time, wertsec  integer, maxsec  integer);"
              rs2.Open sql, conn2
              For i = 1 To 30
                  t = "10:" + Str(i) + ":00"
                  sql = "INSERT INTO akt1 (zeitsec, wertsec, maxsec) VALUES ('" + t + "', '2', '1');"
                  rs2.Open sql, conn2
              Next

              Naja

              mein folgeproblem (schreib ich noch mal extra)  = das array aus der DB in das nötige format zu bekommen ->

              das hab ich:
              $datay1 = mysql_query(sprintf("select wertsec from akt1"));

              und sowas ist für das diagram gewünscht:
              $datay1 = array(6,20,10,22);

              schreib ich als extra frage noch ins forum

              grüße aus LA ralphi

              1. Tach!

                übrigens - das kommische Konstruckt hab ich von php.net (Bsp):

                Wenn du das Example #3 meinst, das nimmt andere Werte als Sekunden. Für Sekunden ist das völlig überflüssig, und für andere Werte kann man mit strtotime() einfacher und durchschaubarer rechnen lassen: strtotime('12:00:00 + 1 minute')

                $zeitsec = date('h:i:s',  mktime(date('h', $zeit), date('i', $zeit),  date('s', $zeit) + $i));
                    mysql_query(sprintf('insert into test.akt1 (zeitsec, wertsec, maxsec) VALUES ("%s", "100", "20")',
                      addslashes($zeitsec) ) );
                hier muss auch der Fehler sein, weil, wenn ich mit VB die tabelle erzeuge und fülle klappt alles:

                For i = 1 To 30
                    t = "10:" + Str(i) + ":00"
                    sql = "INSERT INTO akt1 (zeitsec, wertsec, maxsec) VALUES ('" + t + "', '2', '1');"
                    rs2.Open sql, conn2
                Next

                Mit VB zählst du die Minuten hoch, mit PHP die Sekunden.

                mein folgeproblem (schreib ich noch mal extra)  = das array aus der DB in das nötige format zu bekommen ->

                Aber bitte hier in diesem Thread, sonst fehlt anderen der Zusammenhang. Vielleicht ist es ein Problem, das auf diesem aufbaut.

                das hab ich:
                $datay1 = mysql_query(sprintf("select wertsec from akt1"));
                und sowas ist für das diagram gewünscht:
                $datay1 = array(6,20,10,22);

                mysql_query() liefert kein Ergebnis-Array sondern eine Ressourcenkennung, mit der man dann die Daten abholen (mysql_fetch_*) kann.

                dedlfix.

  2. Dazu möchte ich von den 30 Werten den Ältesten löschen und den aktuellen Einpflegen.

    Dann wärs aber schlüssiger wenn du nicht immer einen löschst, sondern alle bis auf die letzten 30.
    Kommt zwar aufs selbe raus, aber für mich klingts irgendwie konsistenter.
    Das würde dann auch wieder auf 30 beschneiden, wenn mal mehr als 30 Einträge drin stehen.

  3. Hello,

    ich würde die Datensätze gar nicht immer gleich löschen, wenn dafür keine Rechtvorschrift beteht. Ich würde einfach nur die erwünschten (letzten 30) anzeigen lassen. Zusätzlich könntest Du eine Löchmarkierung setzen.

    Physisches Löschen (Purge) ist bei DBMS, wenn Indexe bestehen, eine recht teure Sache. Das sollte man nicht immer sofort tun, sondern dann, wenn sich ein paar zu löschende Datensätze angesammelt haben und gerade nicht viel los ist auf der Datenbank.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de