Permalänk

MySQL - Uppdatera flera rader

Jag försöker att uppdatera en tabell på flera rader samtidigt med ett anrop.
Tabellen som ska uppdateras heter RawStock och innehåller name och amount.
De andra 2 tabellerna som kan vara relevanta är:
Product(ProductName)
Recipie(ProductName, name, amountUsed)

Här ska amount i rawstock minskas med den mängd som passar ihop med recepie.
alltså t.ex.:
Product: Apelsin
Recipie: (Apelsin, Skal, 3), (Apelsin, kött, 4)
RawStock(Skal, 10), (Kött, 100)

Då ska det tas bort från rawstock så skal bara har 7 kvar och kött har 96 kvar.
Den sats jag skrivit nu är:

update RawStock where Name = (select name from Recipie natural join Product where productname = Apelsin) set amount = (amount - (select amount from name from recipie natural join productname ))

men detta verkar inte vara rätt

Permalänk
Medlem
Skrivet av Deathdevil:

Jag försöker att uppdatera en tabell på flera rader samtidigt med ett anrop.
Tabellen som ska uppdateras heter RawStock och innehåller name och amount.
De andra 2 tabellerna som kan vara relevanta är:
Product(ProductName)
Recipie(ProductName, name, amountUsed)

Här ska amount i rawstock minskas med den mängd som passar ihop med recepie.
alltså t.ex.:
Product: Apelsin
Recipie: (Apelsin, Skal, 3), (Apelsin, kött, 4)
RawStock(Skal, 10), (Kött, 100)

Då ska det tas bort från rawstock så skal bara har 7 kvar och kött har 96 kvar.
Den sats jag skrivit nu är:

update RawStock where Name = (select name from Recipie natural join Product where productname = Apelsin) set amount = (amount - (select amount from name from recipie natural join productname ))

men detta verkar inte vara rätt

Du borde kunna lista ut hur det ska fungera för dig, fråga annars igen.
Att google fungerar precis like bra som att fråga här. Första svaret på google för "sql update several rows" ger svaret:

UPDATE config t1 JOIN config t2 ON t1.config_name = 'name1' AND t2.config_name = 'name2' SET t1.config_value = 'value', t2.config_value = 'value2';

Permalänk
Medlem

Lite oklart vad du är ute efter i slutändan, men vad jag förstår så kommer du vilja hålla något slags lager i RawStock och i Recipe ska du fylla på med rader med vad som går åt för ett visst recept. Dessa rader behöver du då först summera innan du drar av dem i RawStock om det skulle kunna förekomma flera rader av samma typ.

Update rs
SET rs.amount = rs.amount - x.amountUsed
from (
select r.Name, sum(r.amountUsed) as amountUsed
from Recipe r
group by r.Name
) as x
inner join RawStock rs on rs.Name = r.Name

Ovan kommer minska Rawstock med de antal som finns specificerade för varje typ (Skal, Kött)

Känns onödigt att ens joina in tabellen Product då den bara innehåller ProductName. I en bra databas bör du istället joina på ID-kolumner av typ integer som är satta till primary eller foreign keys istället för att joina på en textsträng.

Själva strukturen känns lite stökig. Kolumnen Recipe borde kanske heta RecipeComponents och innehålla ett RecipeID som går via en foreign key till en maintabell för själva receptet där namn på receptet, beskrivning, etc finns.

Lycka till!