tjena! Varför måste du göra det i en enda sats? Tror inte det går, men det är nog mer beroende på hur du ansluter till MySQL. Jag skulle lagt all lagerförändring och orderläggning i en transaktion för att inte riskera felaktigt lagersaldo vid ett ev. fel. Hej, Det borde gå med en stored procedure? Typ loopa igenom resultaten ur selectsatsen och sedan köra update. Blir ju bara ett anrop mot servern då Detta borde väl gå? En riktig fullösning:update på flera rader
en fundering. jag håller på med en webshop och nu vill jag uppdatera lagerantal efter köp. normalt hade jag gjort detta med en trigger men mitt webhotell vill ännu inte tillåta triggers på deras mysql servrar...
vad som köpts får jag från min tabell orderitems tabell enligt:
select variantguid, quantity from orderitems where orderguid=x
nu vill jag uppdatera flera rader i en tabell med en enda sql sats men där where satsen skiljer sig enligt:
update variant set stockcount=stockcount-a where variantguid=b
update variant set stockcount=stockcount-c where variantguid=d
.
.
.
osv
men alltså endast en update sats i stil med (ser väldigt skum ut ja...):
update variant set stockcount=stockcount-? where variantguid = (select variantguid, quantity ? from orderitems where orderguid=x)
är detta möjligt? servern kör i detta fall mysql. om inte, hur löser man detta enklast?
/mvh stefanSv: update på flera rader
/JohanSv:update på flera rader
Allt körs i en transaktion :)
Nej jag måste inte, jag bara undrar om det är möjligt? Med tanke på att jag googlat en hel del verkar det ju inte så....
/stefanSv: update på flera rader
Sv: update på flera rader
UPDATE variant INNER JOIN orderitems ON variant.variantguid = orderitems.variantguid
SET variant.stockcount = variant.stockcount - orderitems.quantity
WHERE orderitems.orderguid = x
Eller:
UPDATE variant, orderitems
SET variant.stockcount = variant.stockcount - orderitems.quantity
WHERE variant.variantguid = orderitems.variantguid AND orderitems.orderguid = x
Sv: update på flera rader
<code>
UPDATE variant SET stockcount = stockcount - CASE variantguid WHEN b THEN a WHEN d THEN c ELSE 0 END WHERE variantguid IN (b, d)
</code>
Ett annat alternativ är att designa om så att du aldrig uppdaterar värden, bara "on the fly" räknar ut lagersaldo genom att summera "inkommande tabellen" och subtrahera summan av en "utgående tabell".