20. maj 2006 - 19:13Der er
27 kommentarer og 1 løsning
mysql query
Hey et simpelt spm.
Jeg skal have læst ud fra et par felter i en tabel, helt nøjagtigt 10 stk. jeg ville godt gøre noget alle dette..
<? $noget = mysql_query("SELECT * FROM kampe WHERE maal1 or maal2 or maal3 or maal4 = '$playerId'"); $antal = mysql_num_rows($noget); echo "$antal kasser"; ?>
men den vil kun tage de 2 første :-) jeg har fra maal1 til maal10
<? $noget = mysql_query("SELECT * FROM kampe WHERE maal1 = '$playerId' OR maal2 = '$playerId' OR maal3 = '$playerId' OR maal4 = '$playerId'") or die(mysql_error()); $antal = mysql_num_rows($noget); echo "$antal kasser"; ?>
- for så ville du have opdaget at der kom en fejlbesked fra databasen.
Hvis du kun skulle bruge antallet, så er det i øvrigt meget mere effektivt at bruge count()-funktionen som er der til det samme:
<? $noget = mysql_query("SELECT count(*) AS antal FROM kampe WHERE maal1 = '$playerId' OR maal2 = '$playerId' OR maal3 = '$playerId' OR maal4 = '$playerId'") or die(mysql_error()); $row = mysql_fetch_assoc($noget);; $antal = $row["antal"]; echo "$antal kasser"; ?>
<? $noget = mysql_query("SELECT count(*) AS antal FROM kampe WHERE '$playerId' IN (maal1, maal2, maal3") or die(mysql_error()); $row = mysql_fetch_assoc($noget);; $antal = $row["antal"]; echo "$antal kasser"; ?>
Nielle, din idé tæller underligt nok også kun de 2 første?
hvis nu der er flere scoringer i fx en kamp af samme spiller, så skriver jeg "1" i maal1 maal2 og maal3... hvis jeg gør det tager den kun maal1 med...? også hopper den ned til næste kamp og tjekker det... og kan så også kun ligge et mål til derfra..?
Når du SELECTE'er så får du de rækker ud som opfylder et af kriterierne på højresiden af din WHERE. Hvis enten maal1=$playerId' ELLER maal2=$playerId' EWLLER maal3=$playerId' så får du rækken ud.
Men du får den kun ud *1* gang. Du får den ikke ud 3 grange hvis både maal1=$playerId' OG maal2=$playerId' OG maal3=$playerId'.
Jeg ville godt nok vælge en anden tabel-struktur, men det kan da laves med det du har lige nu:
<? $antal = 0;
for ($maalNr=1; $maalNr<=4; $maalNr++) { $sql = "SELECT count(*) AS antal FROM kampe WHERE maal" . $maalNr . " = '$playerId'"; $query = mysql_query() or die(mysql_error($sql)); $row = mysql_fetch_assoc($query); $antal += row["antal"]; }
for ($maalNr=1; $maalNr<=4; $maalNr++) { $sql = "SELECT count(*) AS antal FROM kampe WHERE maal" . $maalNr . " = '$playerId'"; $query = mysql_query($sql) or die(mysql_error()); $row = mysql_fetch_assoc($query); $antal += row["antal"]; }
morhan> Hvis du mener at der står noget lettere ukorrekt på MySQL's side så skal jeg skam ikke argumentere imod det. Desværre har jeg ikke lige selv en MySQL ved hånden til at prøve efter med.
Jeg er dog ikke i tvivl om at MySQL ikke ligefrem har brokket sig over sætningen - der er vist ikke noget galt med syntaksen - men jeg spekulere nu på om den har givet det rigtige resultat?
Det sidste kan du ikke (simpelt) få ud vha én SQL-sætning med din nuværende databasestruktur.
Du kan derimod lave strukturen om sådan at det er muligt. Til det skal du lave tre tabeller:
kampe ===== kampID ... og måske nogle flere felter?
spillere ======== playerID navn ... og måske nogle flere felter?
maal ==== maalID kampID playerID tidspunkt ... og måske nogle flere felter?
Du bør altså ikke have målene i kamp-tabellen. Ved at lave det på denne måde får du forresten det bonus at der kan være mere end 4 scoringer i en enkelt kamp :^)
Med denne model, ville du kunne få antallet af $playerId's scoringer med denne her:
$sql = "SELECT count(*) FROM maal WHERE spillerID = $playerId"
Ahaa... Det overvejer jeg at lave min struktur om til. Det virker selfølgelig en del smartere... mange tak for hjælpen!
Synes godt om
Ny brugerNybegynder
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.