Gå til innhold

Trenger hjelp med en loop


Anbefalte innlegg

Heisann.

 

Jeg har en parser som har henta odds og resultater og lagt det inn i en database.

Du kan se outputen her: http://avisavis.no/odds2/les.php

 

Jeg vil lage en php-loop som går igjennom alle mulige oddskombinasjoner, men hjernen min strekker ikke helt til for å lage dette smart nok :no:

 

Det loopen skal gjøre er å printe ut alle odds-kombinasjoner som gir mer enn 110% total profitt og som har mer enn 300 kamper som grunnlag.

 

Jeg begynte på den, men det ble bare rot.

http://avisavis.no/odds2/calculate.php

 

Og her er bilde av tabellen:

http://img185.imageshack.us/img185/3807/testc.png

 

<html>
<style type="text/css">
<!--
body {
font-family:Tahoma,Arial,sans-serif;
font-size:92%;
}
table {
border-collapse:collapse;
empty-cells:show;
font-family:Tahoma,Arial,sans-serif;
font-size:92%;
}
.result-ok {
background-color:#80B62A;
color:white;
}
.odd {
background-color: #FFFFFF;
}
.even {
background-color:#F2F2F2;;
}
-->
</style>

Denne saken printer ut alle oddskombinasjoner der du går mer enn 110% i pluss og det er mer enn 300 kamper som grunnlag.

<?php
set_time_limit(7000);

mysql_connect("localhost", "", "") or die(mysql_error());
mysql_select_db("avisaphk_avis") or die(mysql_error());

$tegn = 0;
while ( $tegn <= 2 ) {
$tegn++;
if ( $tegn == 1 ) { $tegnet = ">"; }
if ( $tegn == 2 ) { $tegnet = "<"; }

$nummer = 0;
while ( $nummer <= 4 ) {


$nummer++;

$number = 1;
while ( $number <= 3 ) {
if ( $number == 1 ) { $hvem_odds = H; }
if ( $number == 2 ) { $hvem_odds = U; }
if ( $number == 3 ) { $hvem_odds = B; }
$number++;

$num = 1; 
while ( $num <=10 ) 
{

if ( $nummer == 1 ) { }
if ( $nummer == 2 ) { if ( $numb <= 0 ) {$numb = 10; } $numb = ( $numb - 0.05 ); $add = "AND H <= $numb"; }
if ( $nummer == 3 ) { if ( $numb <= 0 ) {$numb = 10; } $numb = ( $numb - 0.05 ); $add = "AND U <= $numb"; }
if ( $nummer == 4 ) { if ( $numb <= 0 ) {$numb = 10; } $numb = ( $numb - 0.05 ); $add = "AND B <= $numb"; }

$sql = mysql_query("SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add");

// finn ut hvor mange resultater

while($hallo = mysql_fetch_array($sql)) {
$totalt_antall_kamper++;

if ( $hallo[hjemmescore] > $hallo[bortescore] ) {
$hjemmeseier_count++;
$Hgevinst = $Hgevinst + ( $hallo[H] * 10 );
}

if ( $hallo[hjemmescore] == $hallo[bortescore] ) {
$uavgjort_count++;
$Ugevinst = $Ugevinst + ( $hallo[U] * 10 );
}

if ( $hallo[hjemmescore] < $hallo[bortescore] ) {
$borteseier_count++;
$Bgevinst = $Bgevinst + ( $hallo[B] * 10 );
}

}

$innsats = ( $totalt_antall_kamper * 10 );
$total_H_gevinst = ( $Hgevinst - $innsats);
$total_U_gevinst = ( $Ugevinst - $innsats );
$total_B_gevinst = ( $Bgevinst - $innsats );

//echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds >= $num $add].";

if ( $total_H_gevinst > 0 or $total_U_gevinst > 0 or $total_B_gevinst > 0 ) {

if ( $totalt_antall_kamper > 300 ) {

if ( $total_H_gevinst > 0  and ( ( $Hgevinst / $innsats ) * 100 ) > 110 ) {  echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add]."; echo "$totalt_antall_kamper antall kamper, innsats: $innsats"; echo ", HGEVINST: $total_H_gevinst (+". ( ( $Hgevinst / $innsats ) * 100 ). "%)"; }
if ( $total_U_gevinst > 0  and ( ( $Ugevinst / $innsats ) * 100 ) > 110 ) {  echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add]."; echo "$totalt_antall_kamper antall kamper, innsats: $innsats"; echo ", UGEVINST: $total_U_gevinst (+". ( ( $Ugevinst / $innsats ) * 100 ). "%)"; }
if ( $total_B_gevinst > 0  and ( ( $Bgevinst / $innsats ) * 100 ) > 110 ) {  echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add]."; echo "$totalt_antall_kamper antall kamper, innsats: $innsats"; echo ", BGEVINST: $total_B_gevinst (+". ( ( $Bgevinst / $innsats ) * 100 ). "%)"; }

}

}
unset($totalt_antall_kamper);
unset($hjemmeseier_count);
unset($uavgjort_count);
unset($borteseier_count);
unset($Hgevinst);
unset($Ugevinst);
unset($Bgevinst);

$num = ($num + 0.05);
}

}

}

}

Endret av jagarock
Lenke til kommentar
Videoannonse
Annonse

Jeg tror du bør gjøre koden langt mer leselig hvis du ønsker hjelp. Akkurat nå har du en rekke linjer som rett og slett er direkte uleselige. God kode er lesbar, ikke så kort som overhode mulig. Dessuten er det litt vanskelig å vite hva du skal frem til med koden. Hva innebærer «går igjennom alle mulige oddskombinasjoner», og hva er problemet med koden du allerede har? Hva gjør den riktig, og hva gjør den galt?

 

Et generelt tips: Det finnes noe som heter elseif. Den vil utføre kode hvis if er false og uttrykket i elseif er true. Dvs. i stedet for

if ( $tegn == 1 ) { $tegnet = ">"; }
if ( $tegn == 2 ) { $tegnet = "<"; }

kan man skrive

if ( $tegn == 1 ) { $tegnet = ">"; }
elseif ( $tegn == 2 ) { $tegnet = "<"; }

fordi begge deler ikke kan inntreffe samtidig.

 

PS: Hvis koden du allerede har mot formodning gjør ting riktig, men bare er for treg: Har du lagt til indekser for H+U, H+B, U+H, U+B, B+H og B+U?

Lenke til kommentar

jeg kan ikke noe om optimalisering av mysql tabeller.

nå er nesten alt satt til varchar.

 

problemet med koden min er at den er for treg.

 

jeg har lagd en ny versjon og under følger en del av den.

denne delen tar ca. en time å kjøre :ph34r:

 

det hele scriptet tilslutt skal gjøre er å gå igjennom alle oddskombinasjoner som sagt. fks. H odds skal være 1-15, sammen med B odds 1-15. (eks. i rekka vil bli H odds er mer enn 4.55 og B odds mindre enn 8.30) og den må da loope igjennom H/U/B for å lage alle mulige kombinasjoner.

 

$num = 0.95; 
$num2 = 15;

while ( $num2 >= 0 )
{
$num = 0.95; 
while ( $num <=15 ) 
{
$num = ($num + 0.05);

$sql = mysql_query("SELECT * from ny_odds WHERE H >= $num AND H <= $num2");
// hvis det er mindre enn 300 resultater, skip.
if ( mysql_num_rows($sql) < 300 ) { continue; }
// hvis ikke, kjør igjennom denna.
while($hallo = mysql_fetch_array($sql)) {
$totalt_antall_kamper++;
if ( $hallo[hjemmescore] > $hallo[bortescore] ) {
$hjemmeseier_count++;
$Hgevinst = $Hgevinst + ( $hallo[H] * 10 );
}
if ( $hallo[hjemmescore] == $hallo[bortescore] ) {
$uavgjort_count++;
$Ugevinst = $Ugevinst + ( $hallo[U] * 10 );
}
if ( $hallo[hjemmescore] < $hallo[bortescore] ) {
$borteseier_count++;
$Bgevinst = $Bgevinst + ( $hallo[B] * 10 );
}
}
$innsats = ( $totalt_antall_kamper * 10 );
$total_H_gevinst = ( $Hgevinst - $innsats);
$total_U_gevinst = ( $Ugevinst - $innsats );
$total_B_gevinst = ( $Bgevinst - $innsats );
if ( $total_H_gevinst > 0 or $total_U_gevinst > 0 or $total_B_gevinst > 0 ) {
if ( $total_H_gevinst > 0  and ( ( $Hgevinst / $innsats ) * 100 ) > 110 ) { print "<br>\n [SELECT * from ny_odds WHERE H >= $num AND H <= $num2]. $totalt_antall_kamper antall kamper, innsats: $innsats. HGEVINST: $total_H_gevinst (+". ( ( $Hgevinst / $innsats ) * 100 ). "%)"; }
if ( $total_U_gevinst > 0  and ( ( $Ugevinst / $innsats ) * 100 ) > 110 ) { print "<br>\n [SELECT * from ny_odds WHERE H >= $num AND H <= $num2]. $totalt_antall_kamper antall kamper, innsats: $innsats. UGEVINST: $total_U_gevinst (+". ( ( $Ugevinst / $innsats ) * 100 ). "%)"; }
if ( $total_B_gevinst > 0  and ( ( $Bgevinst / $innsats ) * 100 ) > 110 ) { print "<br>\n [SELECT * from ny_odds WHERE H >= $num AND H <= $num2]. $totalt_antall_kamper antall kamper, innsats: $innsats. BGEVINST: $total_B_gevinst (+". ( ( $Bgevinst / $innsats ) * 100 ). "%)"; }

}
unset($totalt_antall_kamper);
unset($hjemmeseier_count);
unset($uavgjort_count);
unset($borteseier_count);
unset($Hgevinst);
unset($Ugevinst);
unset($Bgevinst);

}

$num2 = ($num2 - 0.05);

}

Endret av jagarock
Lenke til kommentar

Vel, hvis koden fungerer som den skal og bare er for treg så er det nok bare å legge til indekser og konvertere feltene vekk fra varchar der det er mulig. Hvis jeg tolker ting riktig så har du ca 20k rader, og det skal isåfall ikke være i nærheten av å være så tregt hvis du faktisk indekserer tabellen korrekt. Som sagt, lag kombinerte indekser for H og U, H og B, U og H, U og B, B og H; og B og U. Indeks for H, B og U alene vil være unødvendig pga. de kombinerte indeksene (MySQL henter det ut fra en av de).

Lenke til kommentar

jeg skjønner ikke helt hva du mener med de kombinerte indeksene :cry:

hvorfor ikke bare indeksere H , U og B?

jeg la nå akkurat til H, U, B, hjemmeseier og borteseier som indekser, og jeg ser hastigheten er mye bedre nå, men fortsatt ikke helt der jeg vil ha det..

 

jeg la til en progressbar, og den går med 1% på 30sek.

så det vil si at den bruker fortsatt 50 minutter, og det bare på å kjøre min H vs max H..

http://avisavis.no/odds2/calc.php

 

jeg har lest meg opp på datatyper nå og tror jeg har fått til greit:

 

database.jpg

Endret av jagarock
Lenke til kommentar

Grunnen til at du trenger en indeks over flere felt er fordi MySQL bare velger en indeks pr. spørring, og du har spørringer som benytter flere felter. Det du må gjøre er å lage en indeks på 2 felter/kolonner («Lag indeks på [ ] kolonner» under struktur i phpmyadmin) og velge H og U, H og B, U og H, U og B, B og H; og B og U. Det vil altså gi 6 indekser hver over 2 felter. Indekser for H, U og B alene vil være overflødig side MySQL kan hente ut f.eks H fra indeksen på H og U kombinert.

Lenke til kommentar
  • 4 uker senere...

Vet ikke om denne er løst eller ikke men jeg vil anbefale bruk av

echo 'Tid: '.(microtime(true) - $ts).'<br />';
(float)$ts = microtime(true);

flere steder i koden din for å se hvilke biter som tar lengst tid og hva du må optimalisere. En MySQL-tabell med lusne 20.000 rader skal ikke trenge noen avansert indeksering utenom det vanlige primærnøkkel/index feltet for å returnere resultatet i løpet av millisekunder.

 

For å virkelig utelukke hvorvidt problemet faktisk er MySQL kan du gjøre om tabellen din til MEMORY fremfor InnoDB eller hva nå enn du bruker til vanlig. Med memory-tabeller jobber MySQL mot maskinens RAM og klarer fin-fint en spørring mot et hundretusentalls rader så raskt at du ikke vil merke noen forsinkelse. Beware though, MEMORY-tabeller er som RAM-disker. Forsvinner strømmen (eller databasemotoren), så forsvinner innholdet!

Endret av PlastBox
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...