Avatar billede shjorth Nybegynder
02. august 2009 - 20:57 Der er 3 kommentarer og
1 løsning

Problemer med formel (php-mysql)

Hejsa.

Jeg står og har et lidt dumt problem.

Jeg driver et browser spil, hvori folk kan oprette forskellige ruter.
Jeg har nu lavet en udvidelse hvor jeg vil beregne et "demand" på en rute.. Det har jeg gjort således:

function demand($from_city) {
       
        $most_used = mysql_query("SELECT from_city, COUNT(id) AS most_used FROM routes GROUP BY from_city ORDER BY most_used DESC LIMIT 1");
        $least_used = mysql_query("SELECT from_city, COUNT(id) AS least_used FROM routes GROUP BY from_city ORDER BY least_used ASC LIMIT 1");
        $most_used_to = mysql_query("SELECT to_city, COUNT(id) AS most_used FROM routes GROUP BY to_city ORDER BY most_used DESC LIMIT 1");
        $least_used_to = mysql_query("SELECT to_city, COUNT(id) AS least_used FROM routes GROUP BY to_city ORDER BY least_used ASC LIMIT 1");
        $actual_q = mysql_query("SELECT from_city FROM routes WHERE from_city = '".$from_city."'");
        $most_row = mysql_fetch_array($most_used);
        $least_row = mysql_fetch_array($least_used);
        $most_row_to = mysql_fetch_array($most_used_to);
        $least_row_to = mysql_fetch_array($least_used_to);

        $most_from_from = $most_row['most_used'];    // Most used departure destination
        $least_from_from = $least_row['least_used'];    // Least used departure destination
        $most_from_to = $most_row_to['most_used'];    // Most used departure destinaton
        $least_from_to = $least_row_to['least_used'];    // Least used departure destination

        if($most_from_from>$most_from_to) {
            $most = $most_from_from;
        }else{
            $most = $most_from_to;
        }
        if($least_from_from<$least_from_to) {
            $least = $least_from_from;
        }else{
            $least = $least_from_to;
        }
        $actual = mysql_num_rows($actual_q);// The actual amount
        $calculation = 58+42*(1-($actual - $least) / ($most - $least));
        $result = round($calculation);
        if($result>99) {
            $result = 99;
        }
        if($result<60) {
            $result = 60;
        }
    return $result;

}

Formlen virker som den skal og retunerer et tal mellem 60 og 99.

Problemet er at der i routes tabellen ligger mere end 50.000 forskellige ruter, så når demand formlen bruges, så knækker serveren fuldstændig sammen.

Jeg er helt blank på hvordan jeg ellers kan gør det her :)

Nogen ideer ?

Mange tak
Avatar billede lakridserne Nybegynder
02. august 2009 - 21:45 #1
Hvor ligger spillet? Adresse?
Avatar billede alphabits Nybegynder
03. august 2009 - 04:54 #2
Du kan ihvertfald gøre dit script hurtigere ved at erstatte de to queries der giver dig from_city minimum og maksimum:

SELECT
    from_city,
    COUNT(id) AS most_used
FROM
    routes
GROUP BY
    from_city
ORDER BY
    most_used DESC
LIMIT 1

(og)

SELECT
    from_city,
    COUNT(id) AS most_used
FROM
    routes
GROUP BY
    from_city
ORDER BY
    most_used ASC
LIMIT 1

... med én query der giver det samme:

SELECT
    MIN(f.cnt) as from_min,
    MAX(f.cnt) as from_max
FROM
    (
        SELECT
            COUNT(id) as cnt
        FROM
            routes
        GROUP BY
            from_city
    ) as f

Og tilsvarende for to_city minimum og maksimum. Ved en hurtig test på min computer skar det halvdelen af tiden fra.
Avatar billede shjorth Nybegynder
07. oktober 2009 - 17:35 #3
Takker smider du et svar?
Avatar billede shjorth Nybegynder
12. juni 2010 - 20:48 #4
Lukker.
Skriv hvis i vil have points
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