mysql gegevens berekenen (twee rijen van elkaar aftrekken)
Door
qyra zayra
op 19-05-2019 20:41
gewijzigd op 19-05-2019 20:50
2.972 views
Hallo,
ik heb een nieuwe relationele database gemaakt (met hulp van enkelen onder jullie ;-) ). Ik denk dat het goed gelukt is, en heb al heel wat kolommen kunnen "berekenen" met data uit andere kolommen / tabel.
Er ontbreekt me nog één kolom om te berekenen.. maar hier loop ik een beetje vast..
Ik zou de gewichttoename tov van de vorige dag willen berekenen (maw de data van twee rijen van elkaar aftrekken). Op onderstaande foto kun je een screenshot zien van een naar csv geexporteerde tabel. De kolom met waarde "0" moet ik nog kunnen berekenen..
Kan iemand me zeggen of dit uberhaupt mogelijk is.. en als het mogelijk, kunnen jullie me op weg zetten?
Stel dat wat ik hierboven zie het resultaat is van:
select * from pup_gewicht where pup_id = 5
Dan krijg je de gewichtstoename tov vorige meting door (het commentaar achter de regels weglaten bij uitvoeren):
select pg.*,pg.gewicht_ochtend - (
select pg.gewicht_avond
from pup_gewicht
where pup_id = pg.pup_id //zelfde pup
and datum < pg.datum //vooor de huidige datum (dus niet de huidige)
order by pg.datum desc //nieuwste eerst = gisteren bovenaan
limit 1 //alleen de eerste = gisteren
) as gewicht_toename_vorige_dag
from pup_gewicht pg
where pup_id = 5
Als ik het goed begrijp is dit de berekening om de gewichtstoename tussen morgen en avond te berekenen..
Waar ik eigenlijk naar op zoek ben is om de gewichtstoename te berekenen tussen twee opeenvolgende avonden..
Als ik in deze regel " select pg.*,pg.gewicht_ochtend - ( select pg.gewicht_avond "
ochtend vervang door avond dan bekom ik "0" als uitkomst...
@Thomas van den Heuvel .. oohh ik ben nog maar een beginner in mysql dus php is voor mij nog een brug te ver.. haha
select pg.*,pg.gewicht_avond - ( //<- hier avond van gemaakt voor avond-avond verschil
select gewicht_avond //<- hier zat foutje, alias prefix weggehaald
from pup_gewicht
where pup_id = pg.pup_id //zelfde pup
and datum < pg.datum //vooor de huidige datum (dus niet de huidige)
order by pg.datum desc //nieuwste eerst = gisteren bovenaan
limit 1 //alleen de eerste = gisteren
) as gewicht_toename_vorige_dag
from pup_gewicht pg
where pup_id = 5
update pup_gewicht pg
set gewicht_toename_vorige_dag = pg.gewicht_avond - (
select gewicht_avond
from pup_gewicht
where pup_id = pg.pup_id
and datum < pg.datum
order by pg.datum desc
limit 1
)
where pup_id = 5
and gewicht_toename_vorige_dag is null
Even voor de zekerheid: welke database gebruik je (naam + versienummer)? (dit kan nl. wel in moderne versies van MariaDB).
"pg" is gewoon een alias. Omdat ik in de sub-select 2x naar pup_gewicht verwijs moet ik er voor zorgen dat ik ze uit elkaar kan houden. Vandaar dat ik een alias toeken ("pg" = pup_gewicht). Als je overal "pg" vervang door "whatever" werkt het ook.