Avatar billede sevinding Juniormester
21. oktober 2010 - 14:29 Der er 9 kommentarer og
1 løsning

Udregne gennemsnitshastighed.

Hej.Jeg har nedenstående script, hvor jeg gerne vil regne gennemsnitshastigheden ud. Det passer bare ad pommeren til.
Skulle der være en der kan se hvor der skulle mangle et tegn eller noget?

$wins = mysql_query("SELECT
ec.id AS id,
ec.rytter AS rytter,
ec.id AS tid,
ec.length AS length,
t.id AS rytterid,
t.name AS name,
t.flags AS flags,
t.logo AS logo,

SUM(ec.length) AS ialt,
SEC_TO_TIME(SUM(TIME_TO_SEC(ec.tid))) AS sum,

HOUR(ec.tid) AS t,
MINUTE(ec.tid) AS m,
SECOND(ec.tid) AS s,

(ec.length  / ((HOUR(ec.tid) * 3600) + (MINUTE(ec.tid) * 60) + (SECOND(ec.tid))) *
3600) AS gns


FROM
    etapeclass AS ec
    INNER JOIN turen AS t

WHERE ec.rytter = t.id

GROUP BY
    t.id
ORDER BY gns ASC

");

while($w=mysql_fetch_array($wins)){

$snit_afrundet = number_format( $w['gns'], 3, ",", "." );

Det skal siges, at det kun er gennemsnittet der laver knuder.
I kan se hvad jeg mener her:
http://www.tourfacts.dk/tid_ialt3.php
På forhånd tak
21. oktober 2010 - 14:41 #1
En hurtig observation: du bruger ec.id to steder, som id og som tid:

SELECT ec.id AS id, ec.rytter AS rytter, ec.id AS tid,....

Mon det skulle vaere en medvirkende faktor?
Avatar billede sevinding Juniormester
21. oktober 2010 - 14:44 #2
Pudsigt. Jeg sad lige og fik øje på den.
Det er rettet, men uden nogen effekt.
Jeg håbede ellers.
21. oktober 2010 - 15:13 #3
Saa lad os se din rettede query.
Avatar billede sevinding Juniormester
21. oktober 2010 - 15:15 #4
Der er såmænd bare tilføjet et "t", men uden virkning.

$wins = mysql_query("SELECT
ec.id AS id,
ec.rytter AS rytter,
ec.tid AS tid,
ec.length AS length,
t.id AS rytterid,
t.name AS name,
t.flags AS flags,
t.logo AS logo,

SUM(ec.length) AS ialt,
SEC_TO_TIME(SUM(TIME_TO_SEC(ec.tid))) AS sum,

HOUR(ec.tid) AS t,
MINUTE(ec.tid) AS m,
SECOND(ec.tid) AS s,

(ec.length  / ((HOUR(ec.tid) * 3600) + (MINUTE(ec.tid) * 60) + (SECOND(ec.tid))) *
3600) AS gns


FROM
    etapeclass AS ec
    INNER JOIN turen AS t

WHERE ec.rytter = t.id

GROUP BY
    t.id
ORDER BY gns ASC

");

while($w=mysql_fetch_array($wins)){

$snit_afrundet = number_format( $w['gns'], 3, ",", "." );
21. oktober 2010 - 16:15 #5
For at faa gns for en rytter skulle du dividere totalafstanden, med totaltiden.  Du beregner totalafstanden og kalder den 'ialt'.  Men i stedet for at dividere 'ialt' med totaltiden dividerer du ec.length med totaltiden.
Avatar billede sevinding Juniormester
21. oktober 2010 - 16:34 #6
Det kan jeg godt se er lidt af et problem.
Jeg har prøvet at skifte ec.length ud med ialt,

(ialt  / ((HOUR(ec.tid) * 3600) + (MINUTE(ec.tid) * 60) + (SECOND(ec.tid))) *
3600) AS gns

men så dukker der slet ikke noget op på siden.
Skal ialt kaldes noget andet?
Jeg håber du har en god tålmodighed :-)
21. oktober 2010 - 19:02 #7
Nu er det noget tid siden jeg selv var i gang med lignende opgaver, saa for at oeve mig lavede jeg et par tabeller seev_etape og seev_turen og fyldte nogle vaerdier i som jeg viser nedenfor og jeg proevede at regne gennemsnitshastigheder ud.

Totalafstanden fandt jeg, som du, ved SUM(ec.length).

Men jeg syntes du gjorde dig unoedvendigt besvaer ud af at finde totaltiden.  Jeg gaar ud fra at datatypen i ec.tid er TIME, og saa finder du totaltiden i sekunder som SUM(TIME_TO_SEC(ec.tid)).

Saa fandt jeg ud af at mysql (eller min version) ikke accepterer aliaser defineret i en query til at definere udtryk i samme query.  Saa jeg fandt gennemsnitstid ved:

SUM(ec.length)/SUM(TIME_TO_SEC(ec.tid)). 

Da jeg i min tabel definerer length i meter faar jeg gennemsnitshastighede i kilometer i timen ved at gange denne stoerrelse med 3.6.

Og saa blander du i en enkelt query vaerdier for enkelt raekker (ec.id, ec.tid, ec.length, o.s.v.) med grupperede vaerdier (..GROUP BY t.id). Det resulterer som regelt i noget sludder idet du blot faar den foerste ec.id, ec.tid, ec.length .. per gruppe.

Saa med nedenstaaende tabeller regner jeg gennemsnitshastighederne per rytter ud saaledes:

SELECT t.name, SUM(ec.length) AS ialt, SUM(TIME_TO_SEC(ec.tid)) AS sum, 3.6*SUM(ec.length)/SUM(TIME_TO_SEC(ec.tid)) AS gns
FROM seev_etape ec JOIN seev_turen t ON ec.rytter = t.id
GROUP BY t.id;

og jeg faar disse resultater (som er matematiske korrekte skoent rytterne nok ikke hoerer til de hurtigste:)

name  ialt  sum  gns 
rytter1 58000 23660 8.82502
rytter2 60000 23900 9.03766
rytter3 62000 24140 9.24606
rytter4 66000 24320 9.76974
rytter5 68000 24620 9.94314

Her er mine tabeller:

CREATE TABLE seev_etape(id INT, rytter INT, tid TIME, length INT);

CREATE TABLE seev_turen(id INT, name VARCHAR(10));

INSERT INTO seev_turen VALUES(1, 'rytter1');
INSERT INTO seev_turen VALUES(2, 'rytter2');
INSERT INTO seev_turen VALUES(3, 'rytter3');
INSERT INTO seev_turen VALUES(4, 'rytter4');
INSERT INTO seev_turen VALUES(5, 'rytter5');

INSERT INTO seev_etape VALUES(1, 1, '01:01:05', 10000);
INSERT INTO seev_etape VALUES(1, 2, '01:02:05', 10000);
INSERT INTO seev_etape VALUES(1, 3, '01:03:05', 10000);
INSERT INTO seev_etape VALUES(2, 4, '01:04:05', 12000);
INSERT INTO seev_etape VALUES(2, 5, '01:05:05', 12000);
INSERT INTO seev_etape VALUES(2, 1, '01:06:05', 12000);
INSERT INTO seev_etape VALUES(3, 2, '01:07:05', 14000);
INSERT INTO seev_etape VALUES(3, 3, '01:08:05', 14000);
INSERT INTO seev_etape VALUES(3, 4, '01:09:05', 14000);
INSERT INTO seev_etape VALUES(4, 5, '01:10:05', 16000);
INSERT INTO seev_etape VALUES(4, 1, '02:11:05', 16000);
INSERT INTO seev_etape VALUES(4, 2, '02:12:05', 16000);
INSERT INTO seev_etape VALUES(5, 3, '02:13:05', 18000);
INSERT INTO seev_etape VALUES(5, 4, '02:13:05', 18000);
INSERT INTO seev_etape VALUES(5, 5, '02:15:05', 18000);
INSERT INTO seev_etape VALUES(6, 1, '02:16:05', 20000);
INSERT INTO seev_etape VALUES(6, 2, '02:17:05', 20000);
INSERT INTO seev_etape VALUES(6, 3, '02:18:05', 20000);
INSERT INTO seev_etape VALUES(7, 4, '02:19:05', 22000);
INSERT INTO seev_etape VALUES(7, 5, '02:20:05', 22000);
Avatar billede sevinding Juniormester
22. oktober 2010 - 03:38 #8
Tudind tak.
Så faldt det på plads. Der røg lige noget ind på lystavlen mht ikke at gøre det mere besværligt end nødvendigt.
22. oktober 2010 - 05:37 #9
Tak for points.  Lad mig nu goere mig endnu mere klog.  Jeg gaar ud fra at en etappeclass har en bestemt laengte uanset hvilken rytter der deltager.  Hvis felterne i tabellen er id, rytter, tid, length, saa maa man for hver rytter i etapen gentage laengden.  Det er ikke alene ekstra arbejde og opslagsplads, men det giver ogsaa muligheden for at komme til at indfoere en forkert laengde, for eksempel 1000m i stedet for 10000 m, og det vil foere til nogle maerkelige gennemsnit.  Jeg foreslaar (jeg ved at det var ikke det du spurgte om) at du laver en saerskilt tabel Etape med etapeid, laengde, maaske navnet paa etapen og andre data hvis relevant og karakteristisk for en etape.  Saa ser det ud for mig som om tabellen Turen stort set er en tabel om de enkelte ryttere.  Jeg foreslaar (hvis du ikke har det allerede) at lave en tabel Rytter med id, navn, logo (hvis det hoerer til en rytter), og naturligvis stamoplysninger som adresse, klub, medlemsnummer, o.s.v.  Saa er der en mange-til-mange relation mellem Etape og Rytter:  hver etape vil have mange ryttere og hver rytter vil deltage i mange etaper.  Standard-loseningen er at lave en Etape_Rytter tabel.  Den tabel skal have kolonnerne Etapeid, Rytterid, tid, maaske dato (maaske goer en rytter den samme etape flere gange,) andre oplysninger der karakteriserer den enkelte tur af en rytter i en etape (hvad betyder for eksempel 'flags?)

Et minimalistisk eksempel:

Etape
1 10000 traeningsetape
2 12345 bakkeetape
3 32137 Langeetape

Rytter
1 hansen
2 jensen
3 olsen
4 svendsen

Etape_Rytter
1 1 0:42:10 1 jan 2010
1 2 0:37:14 1 jan 2010
2 3 1:00:00 1 jan 2010
2 3 0:58:12 2 jan 2010

o.s.v.

Hvis du kan bruge det til noget saa held og lytte.  Ellers glem det.
Avatar billede sevinding Juniormester
22. oktober 2010 - 08:51 #10
Hej igen.
Jeg takker mange gange for din interesse for mit problem.
Det du foreslår er stort set det jeg kører i forvejen. Måske på en lidt anden måde, men chancen for fejl er stort set elimineret.
Jeg ved ikke om du har besøgt linket jeg sendte med:
http://www.tourfacts.dk/tid_ialt.php
Her vises tydeligt hvad "flags" bruges til.
Nok en gang tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester