Robert Rawicz

Robert Rawicz Motorbike mechanic,
The Good Bike Jette
- Brussels SUZUKI...

Temat: Update tabeli sumami z innej tabeli

Taka sytuacja:
pierwsza Tabela "Magazyn" posiada m.in. pola "czesc_id" i "qty" a w nim licznik pobranych z magazynu części
druga Tabela "Rozchody" ma też pole "czesc_id" i pole "rozchod" a w nim liczbe wydanych czesci (dla jednego dokumentu rozchodowego oczywiscie)

Jak napisac SELECT'a ktory podsumuje ilosci wydanych czesci na poszczegolnych dokumentach rozchodowych (tabela "Rozchody" i zrobi UPDATE tabeli "Magazyn" dla pola "qty" (wstawi tam te sumy)? Oczywiście tabele łączymy po polu "czesc_id".

Czyli w skrócie lecimy po wszystkich dokumentach rozchodowych, sumujemy ilosci dla tej samej części a następnie aktualizujemy magazyn w polu "qty" dla danego "czesc_id"

konto usunięte

Temat: Update tabeli sumami z innej tabeli

$czesci_w_rozchodach = Rozchody::all();
foreach($czesci_w_rozchodach as $czesc) {
$magazyn = Magazyn::where('czesc_id', $czesc->czesc_id)->first();
//lub to jeśli czesc_id jest indexem
$magazyn = Magazyn::find($czesc->czesc_id);

$aktualna_ilosc_czesci_w_magazynie = $magazyn->qty
$magazyn->qty = $aktualna_ilosc_czesci_w_magazynie - $czesc->qty;
$magazyn->save();
}

Opisy zmiennych zamień sobie wg uznania. Pisałem z głowy, może nie działać :)
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: Update tabeli sumami z innej tabeli

Ojej machanie aktualizacji iteracyjnie... boli. A jak wierszy w tabeli "rozchodzy" jest 5 mln?
Kolega pytał o rozwiązanie z zapytaniem SQL ale nie podał engine bazy jaki używa, szkoda trochę.

Przykład sprawdzony w PostgreSQL
-- Kasowanie
DROP TABLE IF EXISTS magazyn;
DROP TABLE IF EXISTS rozchod;

-- Przykładowa tabela 'magazyn'
CREATE TABLE magazyn (
czesc_id int,
qty int
);

-- Przykładowa tabela 'rozchody'
CREATE TABLE rozchody (
czesc_id int,
rozchod int
);

-- Zmiany w tabelach - czesc 1
INSERT INTO rozchody VALUES (1, 4), (1, 3), (2, 5), (2, 1), (3, 1), (3,1), (3, 1);

/*
* Dodawanie brakujacych czesci (zostaly zanotowane w tabeli 'rozchodzy'
* ale nie ma jeszcze takiej czesci w tabeli 'magazyn' - nowa czesc
*/
INSERT INTO magazyn (czesc_id, qty)
SELECT r.czesc_id, SUM(r.rozchod) AS liczba
FROM rozchody r
LEFT JOIN magazyn m ON r.czesc_id = m.czesc_id
WHERE m.czesc_id IS NULL
GROUP BY r.czesc_id;

-- Zmiany w tabelach - czesc 2
INSERT INTO rozchody VALUES (2, 4), (3, 1), (7,99);

-- Aktualizacja składów magazynowych
UPDATE magazyn m SET qty = r.liczba
FROM (
SELECT r.czesc_id, SUM(r.rozchod) AS liczba
FROM rozchody r
JOIN magazyn m ON r.czesc_id = m.czesc_id
GROUP BY r.czesc_id
) AS r WHERE m.czesc_id = r.czesc_id;


Jeżeli możesz zaszyć w bazie danych logikę biznesową to lepiej na tabeli 'rozchody' założyć trigger który dla każdego INSERT, UPDATE, DELETE doda lub zaktualizuje wiersz w tabeli 'magazyn'.



Wyślij zaproszenie do