mikrocontroller.net

Forum: PC-Programmierung MySQL-Frage: Neuesten Datensatz updaten


Autor: Server-Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

wie kann ich in einer MySQL-Tabelle den (zeitlich) neuesten Eintrag 
updaten? Gibt es da eine Möglichkeit, das mit einer Abfrage 
hinzubekommen? Die betreffende Tabelle hat eine Spalte mit einem 
Zeitstempel.

Einzeln ist das klar:

Neuesten Datensatz finden: "SELECT * FROM tabelle ORDER by zeitstempel 
DESC LIMIT 1"

Datensatz ändern: "UPDATE tabelle SET spalte=wert WHERE ...?!"

Aber wie bekomme ich beides in eine Abfrage?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subselect?


UPDATE tabelle SET spalte=wert WHERE Zeitstempel = ( select max( 
Zeitstempel) from tabelle where ... )

Autor: Server-Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leider nicht:

Probiert habe ich:

"UPDATE status_log SET zeit=now() where zeit = (select zeit from 
status_log order by zeit desc limit 1)"

Ergebnis:

#1093 - Die Verwendung der zu aktualisierenden Zieltabelle 'status_log' 
ist in der FROM-Klausel nicht zulässig.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schade - das ist mysql scheinbar noch nicht so weit. (MS-SQL kann das).

du solltst aber wenn es denn gehen würde lieber Max und nicht limit 
verwenden. Max sollte etwas schnell sein.

Autor: fbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Max sollte etwas schnell sein.

Bei MySQL bin ich mir da nicht so sicher :)

@Server-Neuling:
Versuchs mal mit
UPDATE status_log SET zeit=now() ORDER BY zeit DESC LIMIT 1;

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fbi schrieb:
> UPDATE status_log SET zeit=now() ORDER BY zeit DESC LIMIT 1;

also wenn das geht, dann verliere komplett den glauben an mysql.

Autor: fbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:)

direkt aus dem "MySQL Reference Manual for version 4.0.22":
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

Autor: Stefan W. (swesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich persönlich würde das anders lösen.

Die Tabelle status_log bekommt eine Spalte status_log_id als PrimaryKey.
Die Spalte ist dann integer oder größer.

Beim Insert kann dann die DB-Engine (autoidentity) selbst oder du in 
einer StoredProcedure diesen Wert inkrementieren und schreiben.

Auf diese Spalte wird auch der Hauptindex der Tabelle gelegt.

Beim Update auf den jüngsten Datensatz würde ich dann einen NestedSelect 
verwenden:
UPDATE bla bla WHERE Zeitstempel IN ( SELECT MAX(Zeitstempel)....)

Vorteil: Beim NestedSelect wird auf jeden Fall der Index verwendet und 
das ganze geht entsprechend schnell.

Bei dem internen ORDER BY & LIMIT und sehr großen Tabellen kann es sonst 
irgendwann knirschen und du musst dich mit den internen Zugriffsplänen 
rumschlagen.

HTH
Stefan

Autor: Jens G. (jensig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UPDATE tabelle SET spalte=wert WHERE Zeitstempel = max(Zeitstempel)

geht nicht?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan W. schrieb:
> UPDATE bla bla WHERE Zeitstempel IN ( SELECT MAX(Zeitstempel)....)

die Idee war ja schon da, myssql kann scheinbar nicht das update und 
select gleichzeitg auf die gleiche Tabelle.

> #1093 - Die Verwendung der zu aktualisierenden Zieltabelle 'status_log'
> ist in der FROM-Klausel nicht zulässig

Autor: Oliver Heinrichs (Firma: OliverHeinrichs.de) (dobson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es da nicht was mit Last_inserted?

EDIT:
http://forums.mysql.com/read.php?12,2060,2060
Vielleicht hilft dir das ein wenig...

Autor: Oliver Heinrichs (Firma: OliverHeinrichs.de) (dobson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I'm sorry...
War der falsche Link... Den hier meinte ich:
http://dev.mysql.com/doc/refman/5.1/de/information...
Auf der Seite ungefähr in der Mitte.

Autor: fbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LAST_INSERT_ID() nutzt hier garnichts, der als letztes eingefügte 
Datensatz muß ja nicht unbeding der "zeitlich neueste Eintrag" sein. Es 
gibt schließlich auch noch UPDAE Statements.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte natürlich auch einfach das ganze in eine Transaktion packen 
und in zwei Querys aufsplitten...

Was aber geht:
create view workaround as SELECT id as timeid from time_update order by time desc limit 1;
UPDATE time_update SET wert='hallo' WHERE id = (SELECT timeid FROM workaround);

Wie zuverlässig das ist oder ob es ggf. Seiteneffekte gibt weiß ich 
natürlich nicht.

Tabelle:
CREATE TABLE  `test`.`time_update` (
  `id` int(11) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `wert` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.