Autor Zpráva
Pája
Profil *
toto je složitější příkaz se krerým si nevím rady.... pokud někdo bude vědět, jak to vyřešit, prosím, napište....

tady přečísluji všechny řádky (když třeba doprostřed tabulky vložím nový zápis:
$denik1 = MySQL_Query("SET @i:=0");
$denik2 = MySQL_Query("UPDATE denik SET cis_radku = ( SELECT @i:= @i+ 1 ) ORDER BY datum ASC, id asc");

mám tyto sloupce:

| pokl_prij | pokl_vyd | pokl_zust | banka_prij | banka_vyd | banka_zust | zust_celk |

a potřebuju mu říct:

pokl_zust = pokl_zust(předchozí řádek) + pokl_prij - pokl_vyd
banka_zust=banka_zust(předchozí řádek) + banka_prij - banka_vyd
zust_celkem = pokl_zust + banka_zust


přičemž musí začít počítat od druhého řádku..... 1. řádek je základní řádek s prvotními údaji od kterých začíná


začal jsem takto:
$denik2 = MySQL_Query("UPDATE denik SET pokl_zust = ( SELECT pokl_zust FROM denik WHERE denik.cis_radku=denik.cis_radku-1 + pokl_prij + pokl_vyd) ORDER BY cis_radku asc");

ale nevím jak mu mám říct, že údaj pokl_zust musí vzít z předchozího řádku a z aktuálního k němu přičíst hodnotu ze sloupce pokl_prij (pokud existuje) a odečíst pokl_vyd, pokud existuje....
Keeehi
Profil
Pája:
Mám lepší nápad. Předělej databázi, protože ji máš špatně navrženou. Proto musíš vytvářet tak komplikované dotazy. Odstraň ty zůstatky a počítej je vždy až ve vývěru z databáze nebo ve scriptu který s daty pracuje. Taky to přečíslovávání řádků je zbytečná věc. Ze strany scriptu je jedno, jestli ta čísla jdou od jedničky nahoru bez jakékoli mezery nebo zda jsou náhodně na přeskáčku. A k ničemu jinému nejsou. Potřebuje jetnotlivé platby při výpisu číslovat od jedničky? Tak číslujte ale k tomu není potřeba nějaké idečko platby. To jsou dvě na sobě nezávislé věci.
Pája
Profil *
Keeehi:

to není řešení... potřebuji tam mít jak čísla řádků tak součty.... pro kontrolu, pro tisk, pro prohlížení... a nepotřebuji je stále znovu a znovu počítat, když se na ně potřebuji podívat... to by bylo ještě horší a pokaždé dávat příkaz na server, to by jednak byl dost zatížený a i časově náročný....
mimochodec
Profil
Pája:
Tohle je každopádně špatně navržená aplikace a vkládání a přepočítávání řádků tímto způsobem je brutální násilí, které bych snad ani do aplikace nezapracovával a pokud k tomu někdy má dojít, řešil bych to pomocí jednorázového php cyklu.

Jak by to myslím šlo navrhnout líp: ke každé operaci bych neukládal výsledek, ale jen pohyb. Spočítat zůstatek lze pak pomocí jednoho nebo dvou SUM() podle způsobu řešení. A v prípadě, že se těch řádků má vyjet víc, spočítal bych to pro první vypsaný řádek pomocí těch dvou SUM() a pak pro každý další prostým sčítáním na úrovni php.
Alphard
Profil
Doplním, že výpočet kumulativních sum není nic výjimečného a lze najít hotová řešení, např. stackoverflow.com/a/3144820 nebo stackoverflow.com/questions/2563918/create-a-cumulative-sum-column-in-mysql apod.
Keeehi
Profil
A já zas doplním, že počítat to pokaždé sice zátěž je, ovšem není to nic extrémního. Schválně jsem si vytvořil pseudoměření: Vytvořil jsem tabulku a naplnil ji milionem záznamů (resp 2^20) náhoných čísel v intervalu -1000 až +1000. Pak jsem změřil, jak dlouho trvá sečíst databázi těchto milion záznamů. Zrovna v mém případě to vyšlo 0.4s. Je to pseoudoměření jelikož do hry může a vstupuje spousta jiných faktorů, ale je vidět, že nic extrémnho to není. S milionem záznamů zvládne mysql obstojně pracovat. Vzhledem k odhadované úrovni tvých zkušeností si nemyslím, že tvůj projekt bude pracovat s databází s řádově vyšími počty záznamů. Spíše naopak. Pokud by tě ale přesto trápila ta zátěž, dá se to řešit. Ovšem ne tím způsobem o jaký se snažíš ty. Viděl bych to na kešování už vypočítaných výsledků. Tudíž třeba ta vygenerovaná html tabulka s daty by se uživateli nejen vypsala, ale zároveň by se ten vygenerovaný html kód uložil i na serveru. Příště by se už php script vůbec neptal databáze a rovnou jen vypsal ten uložený html kód. Samozřejmě je potřeba při změně v databázi promazat i keš aby se při příštím dotazu zobrazila čersvá data, vygeneroval a uložil nový kód. Výkon se tedy šetřit dá, jen se to provádí na jiných místech. A myslím že bude trvat ještě dost dlouho, než budeš muset zavést kešování.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0