MySQL-Update

SimplyFred

Grünschnabel
MySQL-Update

Hallo,
ich möchte gerne so etwas in der Art machen!

UPDATE kisten SET Zustand = 'belegt' WHERE 'Kisten-Nr' IN (SELECT min(`Kisten-Nr`) FROM `kisten` WHERE Zustand = 'frei'";

soll heissen:

Einen Update in Tabelle "kisten" des Feldes "Zustand" von "frei" nach "belegt"
und zwar soll es nur die kleinste "Kisten-Nr" aus der Tabelle "kisten" betreffen.

Wie macht man so etwas?
UPDATE kisten SET Zustand = 'belegt' -> setzt natürlich alle auf "belegt"

SELECT min(`Kisten-Nr`) FROM `kisten` WHERE Zustand = 'frei' -> zeigt mir die kleinste Kisten-Nr. die frei ist an

Wie kann man beide kombinieren?
 
Zuletzt bearbeitet:
Moin SimplyFred,

hast Du doch -bis auf eine fehlende schliessende Klammer am Ende- schon oben stehen?
Oder was genau ist jetzt die Frage?

Grüße
Biber
 
Naja - es funktioniert nicht!

Trotz der Klammer, die beim Kopieren wohl unter den Tisch fiel. Also die war schon drinne.

Code:
SQL-Befehl:  

UPDATE kisten SET Zustand = 'belegt' WHERE 'Kisten-Nr' IN (

SELECT min( `Kisten-Nr` ) 
FROM `kisten` 
WHERE Zustand = 'frei'
) 

MySQL meldet:  

#1093 - You can't specify target table 'kisten' for update in FROM clause

Das ist das Problem
 
Wenn MySQL das nicht in einem Statement schafft, dann musst du eben eine Transaktion mit zwei Statements basteln. Im ersten Schritt holst du dir die ID des zu aktualisierenden Tupels, im zweiten machst du dann das Update.
 
Sorry, SimplyFred,

ist mir unverständlich. Ich habe kein mySQL an meinem WE-Rechner, aber selbst MS-Access, das sicherlich selten im Verdacht steht, mit irgendwelchen DBMSen mithalten zu können, akzeptiert genau diese Syntax... mit dem langsamen "WHERE [kisten-nr] in (Select min(.).." genauso wie mit einem schnelleren "Where [kisten-nr] = (select min(..)..".

Eventuell kannst Du den mySQL-Parser ruhigstellen (und die Query zulassen), wenn Du die "kisten"-Tabelle in der WHERE-Clause unter einem Alias ansprichst.
Code:
UPDATE kisten SET Zustand = 'belegt' 
WHERE 'Kisten-Nr' = (
SELECT min( k.'Kisten-Nr' ) 
FROM kisten k
WHERE k.Zustand = 'frei'
)

Ansonsten muss mal einer mit mySQL aufm PC probieren...

Grüße
Biber
 
Zurück