Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MySql 5 - malo kodiranja treba :)

[es] :: MySQL :: MySql 5 - malo kodiranja treba :)

[ Pregleda: 2007 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kosac
BG

Član broj: 21764
Poruke: 341
77.243.16.*



+5 Profil

icon MySql 5 - malo kodiranja treba :)31.05.2010. u 13:11 - pre 168 meseci
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!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: MySql 5 - malo kodiranja treba :)31.05.2010. u 14:32 - pre 168 meseci
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?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: MySql 5 - malo kodiranja treba :)31.05.2010. u 14:33 - pre 168 meseci
btw. MNOGO korisnije bi ti bilo da napravis triger koji ti popunjava "razliku" kada radis insert/update
 
Odgovor na temu

kosac
BG

Član broj: 21764
Poruke: 341
77.243.16.*



+5 Profil

icon Re: MySql 5 - malo kodiranja treba :)31.05.2010. u 15:11 - pre 168 meseci
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.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: MySql 5 - malo kodiranja treba :)31.05.2010. u 15:53 - pre 168 meseci
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


 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: MySql 5 - malo kodiranja treba :)01.06.2010. u 07:44 - pre 168 meseci
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.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

kosac
BG

Član broj: 21764
Poruke: 341
77.243.16.*



+5 Profil

icon Re: MySql 5 - malo kodiranja treba :)01.06.2010. u 07:50 - pre 168 meseci
juce je juce ... predhodni dan.
sad cu da probam kako radi code.
 
Odgovor na temu

kosac
BG

Član broj: 21764
Poruke: 341
77.243.16.*



+5 Profil

icon Re: MySql 5 - malo kodiranja treba :)01.06.2010. u 08:09 - pre 168 meseci
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;


 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: MySql 5 - malo kodiranja treba :)01.06.2010. u 14:39 - pre 168 meseci
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
 
Odgovor na temu

kosac
BG

Član broj: 21764
Poruke: 341
77.243.16.*



+5 Profil

icon Re: MySql 5 - malo kodiranja treba :)02.06.2010. u 13:05 - pre 168 meseci
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 ...



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: MySql 5 - malo kodiranja treba :)02.06.2010. u 13:16 - pre 168 meseci
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 ..


 
Odgovor na temu

kosac
BG

Član broj: 21764
Poruke: 341
77.243.16.*



+5 Profil

icon Re: MySql 5 - malo kodiranja treba :)02.06.2010. u 13:56 - pre 168 meseci
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!
 
Odgovor na temu

[es] :: MySQL :: MySql 5 - malo kodiranja treba :)

[ Pregleda: 2007 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.