Php/Mysql: 'Kompliceret' beregning på db-udtræk

Tags:    php mysql array

PHP/MySql-nybegynder på dybt vand!

Jeg har en MySql-tabel med følgende opbygning/datatyper:

id # id_case # tal_a # tal_b
1 # 1 # 100 # 110
2 # 1 # 113 # 117
3 # 1 # 121 # 127
4 # 1 # 134 # 156
5 # 2 # 211 # 219
6 # 2 # 221 # 230
7 # 3 # 209 # 230

Jeg skal lave følgende individuelle beregning for hver id_case:

tal_a fra den 2. række MINUS tal_b fra den første række PLUS tal_a fra den 3. række MINUS tal_b fra den 2. række … indtil der ikke er flere muligheder for den enkelte id_case

Eksempel for id_case = 1:
$sum_idcase1 = (113-110) + (121-117) + (134-127) = 3+4+7 = 14

Jeg har desuden brug for en total sum af alle id_cases:

$sum_idcase1 + $sum_idcase2 + $sum_idcase3 = 14+2+0 = 16

Bemærk, jeg har mange (tusinder) rækker i min tabel fordelt på flere hundrede id_case's.

Jeg mangler viden om hvilken angrebsvinkel der er smartest … har ledt desperat på nettet og i mine PHP/Mysql lærebørger for at finde brugbare eksempler, men har været uden held.

Håber nogle kan hjælpe mig på rette vej - på forhånd mange tak :-)




10 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 14 karma
Sorter efter stemmer Sorter efter dato
Det er en tung opgave. Du burde måske overveje, en anden måde at stille din tabel op på? Måske gemme udregningerne, så du ikke skal trække dem hele tiden.

Følgende stykke SQL kan måske hjælpe dig.
Fold kodeboks ind/udSQL kode 


Ved case_id = 3 udskriver den intet resultat, da der kun er en række. Dette burde nemt kunne tweakes til.





Jeg synes Stefan har en pointe med at ændre tabellen. Hvis du laver et ydre loop i=0 ..i++ i stedet for kolonnen id.
I loopet kan du så trække case_id=i og få de aktuelle rækker. Måske skal tabellen sorteres efter case_id, men det er mere nittygritty



(113+121+134)-(110+117+127) = (113-110) + (121-117) + (134-127)

Der er vel ingen grund til, at gøre det mere kompliceret ?



Nej, det har du helt ret i :-)



ah .. et helt ideelt sted for et dumt spørgsmål fra én uden erfaring ..
De tal du rækker ud efter i andre rækker .. er det ligegyldigt om de tilhører et andet case_id? I modsat fald mangler du at teste case_id tilhørsforhold




Hej Carsten
Nej, det er ikke ligegyldigt. Beregningen skal udføres:
- isoleret for hver id_case (skal anvendes til ét formål)
- summen af beregningen for hver af de isolerede id_cases (skal anvendes til et andet formål)

Håber at denne forklaring er lidt tydeligere!



Hej Stefan

MANGE tak for SQL'en. Jeg vil forsøge, at få det til at fungere senere i dag. Det ser lovende/logisk ud. Umiddelbart betyder det intet, at der ikke udskrives et resultat for id_case = 3 ... resultatet er alligevel 0.

Jeg arbejder selv på en anden model, hvor jeg laver et langt mere simpelt SQL-udtræk og hvor jeg så laver udregningerne på basis af de arrays jeg opsamler data i. Det må kunne gøres på en ret simpel måde - mit problem er her, at jeg skal have læst 'lidt' mere på array-funktionerne!

Som nybegynder kan jeg være i tvivl om, hvor man skal ligge de tungeste opgaver - er det på MySql-serveren eller i PHP? eller er det ikke noget man skal bekymre sig om?



Hej Stefan og Carsten

I skriver begge at jeg burde ændre tabellen. Jeg kan ikke rigtig se det for mig - hvad har I i tankerne - hvordan skal tabellen ændres for at det bliver lettere at foretage det nødvendige udtræk til at lave udregningerne for

- et enkelt id_case
- for summen af de enkelte id_cases

Beklager min uvidenhed - det skal helst skæres ud i pap!

Mvh
Kristian


=====

Jeg har leget med nyt design af tabellen - tror jeg er på sporet af en bedre løsning. Jeg takker mange gange for jeres hjælp/vejledning. Damn, hvor er der meget man skal lære!



Indlæg senest redigeret d. 01.03.2012 17:00 af Bruger #16770
Kristian,
Jeg er godt nok den sidste du skulle spørge ..
Ok, jeg kan godt se, at du har brug for et sted at gøre af din beregning.
Fold kodeboks ind/udCSharp kode 



Jeg har ikke syntaxen, så jeg skriver som en slags array.



Indlæg senest redigeret d. 02.03.2012 23:15 af Bruger #17086
Hej Carsten

Mange tak for dit kodeeksempel. Jeg er ikke helt sikker på, at det hjælper mig, men jeg vil forsøge at gøre anvendelse af den.
Jeg har fulgt jeres opfordring og kigger på alternativt tabeldesign + en masse læsning på MySql :-)



t