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.phpPå forhånd tak
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 - 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);
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.