Rudde Skrevet 20. november 2011 Del Skrevet 20. november 2011 Hei, jeg har ett script som er utrolig teit kodet Jeg sjekker gjennom Users^2 noe som tar jævelig lang tid med 7000 brukere. $list = array(); $query = mysql_query("SELECT id, username, ip_reg, ip_last, referral FROM users") or die(mysql_error()); while($row = mysql_fetch_array($query)) { if($row['ip_reg'] != $row['ip_last']) { $ips = array($row['ip_reg'], $row['ip_last']); }else{ $ips = array($row['ip_reg']); } $ips = join('\',\'',$ips); $result = mysql_result(mysql_query("SELECT COUNT(id) FROM `users` WHERE referral = '" . $row['id'] . "' AND ip_reg NOT IN ('" . $ips . "') AND ip_last NOT IN ('" . $ips . "')"),0); if($result > 0) { $list[] = array("username" => $row['username'], "id" => $row['id'], "result" => $result); } } function orderBy($list, $field) { $code = "return strnatcmp(\$a['$field'], \$b['$field']);"; usort($list, create_function('$a,$b', $code)); return $list; } $list = orderBy($list, 'result'); $list = array_reverse($list); Altså jeg sjekker om brukerne har vervet noen brukere og sørger for at de ikke er registrert med eller har logget inn med noen av brukerens IP'er altså de kan jo regge en bruker fra en proxy og så logge på så vil den ikke tels som vervet. Lurer på om det finnes noen måte og optimalesiere scriptet på uten å måtte opprette en rad for antall folk brukeren har vervet? Lenke til kommentar
etse Skrevet 20. november 2011 Del Skrevet 20. november 2011 (endret) Edit: Jeg anntar at du klarer å skrive PHP-delen som bruker svaret fra spørringene fint selv Hvis ikke må du bare si ifra. du har en spørring inni en løkke, noe som gjør ar mySQL plutselig må parse veldig mange spørringer, det du er ute etter er vel å forbedre spørringen din, hvor du får alt av informasjonen du trenger med 1 spørring. Husk at med mySQL er det ikke å kjøre selve spørringen som ofte tar veldig mye tid, med det å parse tekst-strengen. (det er derfor mange språk går vekk i fra streng-basserte spørringer for tiden) Så det du ønsker å plukke ut er: Alle brukere som har en referral hvor det det IKKE er noen likhet mellom IP-adressen ? I så fall kan du bruke denne spørringen: SELECT a.id, a.username, a.ip_reg, a.ip_last, a.referral, count(*) as num_referalls FROM users as a INNER JOIN users as b ON a.id = b.referral WHERE a.ip_reg NOT IN (b.ip_reg, b.ip_last) AND a.ip_last NOT IN (b.ip_reg, b.ip_last) GROUP BY a.id; Med et dataset som er slik som dette: id username ip_reg ip_last referral ---------- ---------- ---------- ---------- ---------- 1 test1 1 1 0 2 test3 2 2 0 3 test4 3 4 1 4 test5 5 5 3 5 test6 6 2 2 6 test7 10 1 1 7 test8 8 1 1 8 test9 9 2 2 9 test10 12 12 1 Får du dette som output: id username ip_reg ip_last referral num_referalls ---------- ---------- ---------- ---------- ---------- ------------- 1 test1 1 1 0 2 3 test4 3 4 1 1 Er ikke brukerens ID i denne listen, så har han ingen gyldige referalls. Ønsker du å få en oversikt over hvor mange ugyldige referalls en bruker har kan du bruke noe lignende dette: SELECT a.id, a.username, a.ip_reg, a.ip_last, a.referral, count(*) as num_illegal_referrals FROM users as a INNER JOIN users as b ON a.id = b.referral WHERE a.ip_reg IN (b.ip_reg, b.ip_last) OR a.ip_last IN (b.ip_reg, b.ip_last) GROUP BY a.id; id username ip_reg ip_last referral num_illegal_referrals ---------- ---------- ---------- ---------- ---------- --------------------- 1 test1 1 1 0 2 2 test3 2 2 0 2 Man kan da og lett få en fullstendig oversikt over hvilke brukere som har ugyldige referral brukere, og hvilke dette er så man lett kan slette de: SELECT a.id, a.username, a.ip_reg, a.ip_last, a.referral, b.id as illegal_user_id FROM users as a INNER JOIN users as b ON a.id = b.referral WHERE a.ip_reg IN (b.ip_reg, b.ip_last) OR a.ip_last IN (b.ip_reg, b.ip_last); id username ip_reg ip_last referral illegal_user_id ---------- ---------- ---------- ---------- ---------- --------------- 1 test1 1 1 0 6 1 test1 1 1 0 7 2 test3 2 2 0 5 2 test3 2 2 0 8 Om du er interesert i å jobbe opp i mot databaser vil jeg anbefale deg å kjøpe en bok som tar for seg databaser og relasjonsalgebra. Da dette kan være veldig relevant Endret 20. november 2011 av etse 1 Lenke til kommentar
Rudde Skrevet 20. november 2011 Forfatter Del Skrevet 20. november 2011 Tusen takk, jeg skal sette meg ned og jobbe med dette nå Har du noen bøker du ville anbefalt meg? Lenke til kommentar
etse Skrevet 20. november 2011 Del Skrevet 20. november 2011 (endret) Personlig har jeg brukt boken "Database system concepts", men den tar for seg veldig mye du kanskje ikke er interesert i. Som f.eks. hvordan databasen faktisk fungerer, hvordan den lagrer ting i filer og hvordan den finner frem informasjonen o.s.v. Altså ting som kan få det til å forstå hvordan du ville laget din egen database. Om dette intereserer deg anbefaler jeg den. For kun å bli flink på spørringer virker denne boken veldig grei: Beginning SQL Queries: From Novice to Professional (Books for Professionals by Professionals) [Paperback] http://www.amazon.com/Beginning-SQL-Queries-Professional-Professionals/dp/1590599438/ref=sr_1_sc_3?ie=UTF8&qid=1321798723&sr=8-3-spell Denne virket og veldig grei: SQL Cookbook (Cookbooks (O'Reilly)) [Paperback] http://www.amazon.com/Cookbook-Cookbooks-OReilly-Anthony-Molinaro/dp/0596009763/ref=sr_1_5?ie=UTF8&qid=1321799107&sr=8-5 Endret 20. november 2011 av etse 1 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå