Avatar billede michaelgm Nybegynder
28. november 2007 - 01:22 Der er 8 kommentarer og
1 løsning

Max km tal ved sidste tankning

Jeg finder den største km på den sidste nye dato på den bestemte bus. Og det kan jeg gøre sådan her:

$kmSQL = "
SELECT
vs.Km
FROM
vaerksted.vspeedo AS vs
WHERE
vs.ts = (SELECT MAX(vss.ts) FROM vaerksted.vspeedo vss WHERE vss.vognnr='$s[bus]' AND vss.Tekst='Hjemmetank') AND
vs.vognnr='$s[bus]'";
$res = mysql_query($kmSQL) or die (mysql_error());
while ($db = mysql_fetch_array($res))
{   
    $km = $db[Km];
}

Problemet er bare at den løber igennem 50 busser. Og det går alt for langsomt. Kan man gøre det på en smartere og hurtigere måde?
Avatar billede arne_v Ekspert
28. november 2007 - 02:10 #1
Med passende index'er bør det der da gå rimeligt hurtigt !

Alternativ:

SELECT km,ts
FROM vspeedo
WHERE vognnr='$s[bus]' AND tekst='Hjemmetank'
ORDER BY ts DESC
LIMIT 1
Avatar billede michaelgm Nybegynder
28. november 2007 - 13:15 #2
Nu er det første gang jeg har prøvet det med index. Og ved ikke om jeg har lavet det rigtigt. Jeg har lavet normal index på vognnr og ts. Det tager ca 4-5 sek. Før jeg lavede index tog det 50-60 sek så måtte sætte tiden op for at se hvor længe det vil ta.

Alternativet virkede desværre ikke. Så får jeg samme km på alle busserne.
Avatar billede arne_v Ekspert
29. november 2007 - 00:58 #3
øh - den returnerer vel kun tal for den valgte bus ??
Avatar billede michaelgm Nybegynder
30. november 2007 - 11:57 #4
Nej den retunerer samme km for den højeste km for en af busserne, på alle busserne?
feks:

busnr: 606, 57000km
busnr: 607, 57000km
busnr: 608, 57000km
osv..
Avatar billede arne_v Ekspert
01. december 2007 - 01:26 #5
Umuligt. LIMIT 1 vil altid kun returnere 1 række.

Prøv og vis hvilken SQL du faktisk kører.
Avatar billede michaelgm Nybegynder
03. december 2007 - 20:27 #6
Ved godt den sidste retunere 1 da der er limit på. Men den køre jo igennem 50 busser. Men her her er mine sql sætninger:

$eftersyn="
SELECT
cv.BUS,
Max(vke.kmtaeller) as kmtaeller,
vke.kmtjek as kmtjek,
Max(DATE_FORMAT(vke.dato,'%d-%m-%Y')) AS dato
FROM
c2.vognlob AS cv
Left Outer Join vaerksted.kmeftersyn AS vke ON cv.BUS = vke.busnr
WHERE
cv.PLANPERIODE =  '19'
GROUP BY
cv.BUS
ORDER BY
vke.kmtaeller
";

$resultat = mysql_query($eftersyn);
$eftersyn = array();
while ($db = mysql_fetch_array($resultat))
{   
    $kmSQL = "
    SELECT
    vs.Km
    FROM
    vaerksted.vspeedo AS vs
    WHERE
    vs.ts = (SELECT MAX(vss.ts) FROM vaerksted.vspeedo vss WHERE vss.vognnr='$db[BUS]' AND vss.Tekst='Hjemmetank') AND
    vs.vognnr='$db[BUS]'
    LIMIT 1";
    $ress = mysql_query($kmSQL) or die (mysql_error());
    while ($dbs = mysql_fetch_array($ress))
    {   
        $vkm = $dbs[Km];
    }
}
Avatar billede michaelgm Nybegynder
26. december 2007 - 14:24 #7
Der var ingen der havde en bedre løsning?
Avatar billede michaelgm Nybegynder
10. januar 2008 - 20:32 #8
Lukker igen
Avatar billede michaelgm Nybegynder
10. januar 2008 - 20:32 #9
prøver lige igen
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
Computerworld tilbyder specialiserede kurser i database-management

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