28 Stimmen

MySQL: Aktualisierte Zeilen zurückgeben

Ich versuche, diese beiden Abfragen in Twisted Python zu kombinieren:

SELECT * FROM table WHERE group_id = 1013 and time > 100;

und:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100

in einer einzigen Abfrage zusammenfassen. Ist es möglich, dies zu tun?

Ich habe versucht, die SELECT-Abfrage in eine Unterabfrage einzufügen, aber ich glaube nicht, dass die gesamte Abfrage mir das Gewünschte liefert.

Gibt es eine Möglichkeit, dies zu tun? (noch besser, ohne Unterabfrage) Oder muss ich einfach bei zwei Abfragen bleiben?

Ich danke Ihnen,

Quan

10voto

Tyler Punkte 186

Ich bin zwar spät dran, aber ich hatte das gleiche Problem, und die Lösung, die ich am hilfreichsten fand, war die folgende:

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;

von https://gist.github.com/PieterScheffers/189cad9510d304118c33135965e9cddb

9voto

AW101 Punkte 1610

Offenbar hat mysql etwas, das von Nutzen sein könnte, vor allem, wenn Sie nur eine Zeile aktualisieren.

Dieses Beispiel ist von: http://lists.mysql.com/mysql/219882

UPDATE mytable SET
mycolumn = @mycolumn := mycolumn + 1
WHERE mykey = 'dante';

SELECT @mycolumn;

Ich habe das zwar noch nie ausprobiert, aber lassen Sie mich wissen, wie Sie damit zurechtkommen.

4voto

juergen d Punkte 194549

Sie können diese Abfragen nicht direkt miteinander kombinieren. Sie können jedoch eine gespeicherte Prozedur schreiben, die beide Abfragen ausführt, zum Beispiel:

delimiter |
create procedure upd_select(IN group INT, IN time INT)
begin
    UPDATE table SET time = 0 WHERE group_id = @group and time > @time;
    SELECT * FROM table WHERE group_id = @group and time > @time;
end;
|
delimiter ;

3voto

J. Miller Punkte 757

Sie versuchen also, das System zurückzusetzen. time auf Null zu setzen, wenn Sie auf eine Zeile zugreifen - eine Art Trigger, aber MySQL kann keine Trigger nach SELECT .

Wahrscheinlich ist es am besten, eine gespeicherte Prozedur zu schreiben, die die Zeile aktualisiert und dann zurückgibt, um dies mit einer Serveranfrage von der Anwendung aus zu tun. Wenn es sehr wichtig ist, dass beides zusammen geschieht, verpacken Sie die beiden Anweisungen in eine Transaktion.

-1voto

Andrew Zaitsev Punkte 275

Es gibt eine schnellere Version der Rückgabe von aktualisierten Zeilen, und mehr richtig, wenn der Umgang mit hoch belasteten System fragt nach der Ausführung der Abfrage zur gleichen Zeit auf dem gleichen Datenbank-Server

update table_name WITH (UPDLOCK, READPAST)
SET state = 1
OUTPUT inserted.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X