[ kosac @ 31.05.2010. 13:11 ] @
Da li neko moze da mi pomogne ... MySql 5
postoji tabela
- abc

sa poljima
- datum
- pozicija
- vrednost
- razlika


ja iz nekog csv fajla upumpavam tabele datum, vrednost i pozicija u tabelu svakog dana.

ono sto mi treba je da posle tog import-a pustim jos jedan query (ili sta vec) koji bi za svaku
poziciju pronasao vrednost od juce, oduzeo je od danasnje vrednosti, i upisao je u polje razlika.

Znaci treba mi za svaku poziciju razlika vrednosti u odnosu na jucerasnji dan.

Hvala!
[ bogdan.kecman @ 31.05.2010. 14:32 ] @
i naravno nisi ni probao i ocekujes da ti to neko napise, onako, usput :D ...

da si jos bar napisao kako TACNO izgleda tabela? sta je taj datum? datetime? date? timestamp? .. el imas neki primarni kljuc ti u toj tabeli ?

ako pretpostavimo

Code:

create table abc (
  id int not null auto_increment primary key,
  pozicija int,
  datum date,
  vrednost int,
  razlika int
) engine = myisam;


onda za sve od "danas"

Code:
 
update abc set 
   razlika = (
     select juce.vrednost - danas.vrednost 
     from abc  juce, abc danas 
     where 
        juce.pozicija = danas.pozicija and 
        juce.datum=DATE_SUB(NOW(), INTERVAL 1 DAY) and 
        danas.datum=NOW() and 
        danas.id = abs.id 
     limit 1
  ) 
where 
  datum=NOW();


jasno?
[ bogdan.kecman @ 31.05.2010. 14:33 ] @
btw. MNOGO korisnije bi ti bilo da napravis triger koji ti popunjava "razliku" kada radis insert/update
[ kosac @ 31.05.2010. 15:11 ] @
realno nisam se puno trudio ... obicno izguglam nekako ali ovo bas i nije moje uze strucno polje
a i nesto sam tanak sa vremenom pa rekoh da pitam nekog strucnjaka.

Ideja o trigeru je EXTRA pa cu pokusati da se snadjem i to da namestim.
Inace kad pokrenem tvoj code dobijem odgovor:

You can't specify target table 'abc' for update in FROM clause

i ne uradi nista

p.s. pogodio si strukturu polja.
[ bogdan.kecman @ 31.05.2010. 15:53 ] @
da, zaboravih, taj limit nije skinut sa update-a ni u 5.6 :(

Code:

UPDATE `abc` SET razlika = (
  SELECT juce.vrednost - danas.vrednost 
  FROM 
    (
      SELECT * FROM `abc` WHERE datum=date_sub(curdate(), interval 1 day)
    ) juce, 
    (
      SELECT * FROM `abc` WHERE datum=curdate()
    ) danas
  WHERE   
    juce.pozicija = danas.pozicija and 
    danas.id = abc.id 
    LIMIT 1
  ) 
WHERE
  abc.datum=curdate();


zavisno od toga koliko su ti smisleni podaci - ovo bi trebalo da radi .. mada, ako ti pozicija nije unique vrednost - nece da radi bas najbolje (posto ne postoji nacin da linkujes jucerasnji i danasnji dan ako nemaju unique vrednost) - tome onaj limit 1 cisto da ne bi puko sql, ali ko sto rekoh ako nemas unique kljuc po (datum, pozicija) to nece da valja ...

dalje, obrati paznju da ce ovo da napravi - cudo temporary tabela, da je sporo do zla boga, da ne ume bas pametno da koristi indexe i sve u svemu - skarabudzeno je resenje ... trigeri su pravilan nacin da odrzavas te vrednosti

[ Shinhan @ 01.06.2010. 07:44 ] @
Takođe, ako pod "juče" misliš na "prethodni dan u kojem ima nešto snimljeno što ne mora biti juče nego i prošli petak" onda ti ovo opet neće raditi.
[ kosac @ 01.06.2010. 07:50 ] @
juce je juce ... predhodni dan.
sad cu da probam kako radi code.
[ kosac @ 01.06.2010. 08:09 ] @
Citat:
bogdan.kecman: da, zaboravih, taj limit nije skinut sa update-a ni u 5.6

Code:

UPDATE `abc` SET razlika = (
  SELECT juce.vrednost - danas.vrednost 
  FROM 
    (
      SELECT * FROM `abc` WHERE datum=date_sub(curdate(), interval 1 day)
    ) juce, 
    (
      SELECT * FROM `abc` WHERE datum=curdate()
    ) danas
  WHERE   
    juce.pozicija = danas.pozicija and 
    danas.id = abc.id 
    LIMIT 1
  ) 
WHERE
  abc.datum=curdate();


Odradi, ne prijavi nikakav problem ali u polju razlika nema nista.
Mala ispravka u codu ispod je da je polje pozicija zapravo VARCHAR(45)
Code:

create table abc (
  id int not null auto_increment primary key,
  pozicija varchar,
  datum date,
  vrednost int,
  razlika int
) engine = myisam;


[ bogdan.kecman @ 01.06.2010. 14:39 ] @
proveri sta ti radi taj unutraslji select - izbaci danas.id = abc.id ...ja sam napravio temp tabele i radilo je .. pitanje koliko ti je ta tabela logicno napunjena - ima mnogo nacina da to ne radi
[ kosac @ 02.06.2010. 13:05 ] @
Citat:
bogdan.kecman: proveri sta ti radi taj unutraslji select - izbaci danas.id = abc.id ...ja sam napravio temp tabele i radilo je .. pitanje koliko ti je ta tabela logicno napunjena - ima mnogo nacina da to ne radi


Prvo da se zahvalim na pomoci. Znam samo osnove i znaci mi ova pomoc.

Skontao sam da je problem sto ovo radi za danasnji datum ali ne i za sve one predhodne
koje nisam odradio.
Kada sam uneo danasnje podatke, odredio je razliku za prvu lokaciju na koju je naisao i
tu razliku upisao za sve ostale lokacije.

Takodje sam zaboravio da kazem da ovo je polje ID zapravo Auto Increment pa sam izbacio
Code:
danas.id = abc.id 
.

Moze pomoc kako da mi za svaku lokaciju upise drugu/odgovarajucu razliku?
Ima li sanse da ovo nekako primenim retroaktivno za poslednjih 10-tak dana?

posle bih ga dodao kao triger ...



[ bogdan.kecman @ 02.06.2010. 13:16 ] @
to si trebao da izbacis samo ako pustas "samo unutrasnji upit" inace moras da ga ostavis u upitu da ne bi dobio bas to da svi dobiju istu vrednost.

za retroaktivno ..

curdate() zameni sa datumom koji oces da ti bude "danas"

date_sub(curdate(), interval 1 day) zameni sa datumom koji oces da ti bude juce

i kreni od najstarijeg datuma, jedan po jedan unapred ..

[ kosac @ 02.06.2010. 13:56 ] @
Citat:
bogdan.kecman: to si trebao da izbacis samo ako pustas "samo unutrasnji upit" inace moras da ga ostavis u upitu da ne bi dobio bas to da svi dobiju istu vrednost.

za retroaktivno ..

curdate() zameni sa datumom koji oces da ti bude "danas"

date_sub(curdate(), interval 1 day) zameni sa datumom koji oces da ti bude juce

i kreni od najstarijeg datuma, jedan po jedan unapred ..


Savrsenstvo je u jednostavnim stvarima
Sve radi.

Hvala puno na pomoci!