Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 3.241 pregleda

Najnovija ↓

MySql 5 - malo kodiranja treba :) 31.05.2010. u 14:11 · pre 199 meseci #1
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!
Re: MySql 5 - malo kodiranja treba :) 31.05.2010. u 15:32 · pre 199 meseci #2
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?
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: MySql 5 - malo kodiranja treba :) 31.05.2010. u 16:11 · pre 199 meseci #4
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. :)
Re: MySql 5 - malo kodiranja treba :) 31.05.2010. u 16:53 · pre 199 meseci #5
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

Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: MySql 5 - malo kodiranja treba :) 01.06.2010. u 08:44 · pre 199 meseci #6
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.
Potpis
"Common sense is not so common." - Voltaire
Re: MySql 5 - malo kodiranja treba :) 01.06.2010. u 09:09 · pre 199 meseci #8
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;


Re: MySql 5 - malo kodiranja treba :) 01.06.2010. u 15:39 · pre 199 meseci #9
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
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: MySql 5 - malo kodiranja treba :) 02.06.2010. u 14:05 · pre 199 meseci #10
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 ...



Re: MySql 5 - malo kodiranja treba :) 02.06.2010. u 14:16 · pre 199 meseci #11
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 ..

Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: MySql 5 - malo kodiranja treba :) 02.06.2010. u 14:56 · pre 199 meseci #12
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! :)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme