Avatar billede fragze Juniormester
20. maj 2006 - 19:13 Der 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
Avatar billede nielle Nybegynder
20. maj 2006 - 19:21 #1
$noget = mysql_query("SELECT * FROM kampe WHERE maal1 = '$playerId' OR maal2 = '$playerId' OR maal3 = '$playerId' OR maal4 = '$playerId'");
Avatar billede nielle Nybegynder
20. maj 2006 - 19:24 #2
Og husk i øvrigt fejlhåndtering:

<?
$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.
Avatar billede nielle Nybegynder
20. maj 2006 - 19:26 #3
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";
?>
Avatar billede morhan Novice
20. maj 2006 - 19:32 #4
hvis mange kolonner skal afsøges for samme værdi, kan det være nemmere at skrive

$noget = mysql_query("SELECT count(*) AS antal FROM kampe WHERE '$playerId' IN (maal1, maal2, maal3") or die(mysql_error());
Avatar billede fragze Juniormester
20. maj 2006 - 19:39 #5
dette her giver en error?

<?
$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?
Avatar billede nielle Nybegynder
20. maj 2006 - 19:40 #6
Man kan heller ikke bruge IN på den måde.
Avatar billede nielle Nybegynder
20. maj 2006 - 19:41 #7
Hvad mener du med at den kun tager de to første? Får du tallet 2 frem eller hvad?
Avatar billede fragze Juniormester
20. maj 2006 - 19:43 #8
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..?
Avatar billede nielle Nybegynder
20. maj 2006 - 19:49 #9
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'.
Avatar billede fragze Juniormester
20. maj 2006 - 19:50 #10
og det er ikke muligt at få? på en eller anden måde? :)
Avatar billede nielle Nybegynder
20. maj 2006 - 20:00 #11
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"];
}

echo "$antal kasser";
?>
Avatar billede morhan Novice
20. maj 2006 - 20:08 #12
den sql burde nu nok virke, men der mangler en afsluttende parentes lige efter maal3
Avatar billede fragze Juniormester
20. maj 2006 - 20:11 #13
Parse error: syntax error, unexpected '[' i denne  $antal += row["antal"];
Avatar billede nielle Nybegynder
20. maj 2006 - 20:13 #14
$query = mysql_query() or die(mysql_error($sql));

- rettes til:

$query = mysql_query($sql) or die(mysql_error($sql));
Avatar billede nielle Nybegynder
20. maj 2006 - 20:14 #15
... til:

$query = mysql_query($sql) or die(mysql_error());
Avatar billede nielle Nybegynder
20. maj 2006 - 20:20 #16
morhan> I følge MySQL'se egen side, er syntaksen for en IN:

    expr IN (value,...)

Altså:

    maal1 IN (1, 2, 3, 42)

- ikke:

    42 IN (maal1, maal2, maal3, maal4)

(ref: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html).
Avatar billede nielle Nybegynder
20. maj 2006 - 20:22 #17
... men du har ret: Der var jo også en rigtig PHP-fejl i det viste kode :^)

$noget = mysql_query("SELECT count(*) AS antal FROM kampe WHERE '$playerId' IN (maal1, maal2, maal3") or die(mysql_error());

- skulle have været:

$noget = mysql_query("SELECT count(*) AS antal FROM kampe WHERE '$playerId' IN (maal1, maal2, maal3)" or die(mysql_error());
Avatar billede fragze Juniormester
20. maj 2006 - 20:23 #18
får den sq stadig :S
Avatar billede nielle Nybegynder
20. maj 2006 - 20:23 #19
Hvordan ser din kode ud?
Avatar billede morhan Novice
20. maj 2006 - 20:28 #20
prøv, så afsluttes både sql og php korrekt med en parentes

$noget = mysql_query("SELECT count(*) AS antal FROM kampe WHERE '$playerId' IN (maal1, maal2, maal3)") or die(mysql_error());
Avatar billede fragze Juniormester
20. maj 2006 - 20:29 #21
<?
$antal = 0;

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"];
}

echo "$antal kasser";
?>
Avatar billede morhan Novice
20. maj 2006 - 20:29 #22
jeg afprøvede forresten sqlen før jeg submittede, og min mysql æder den uden problemer
Avatar billede nielle Nybegynder
20. maj 2006 - 20:37 #23
$antal += row["antal"];

- skal lige rettes til:

$antal += $row["antal"];
Avatar billede nielle Nybegynder
20. maj 2006 - 20:43 #24
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?
Avatar billede fragze Juniormester
20. maj 2006 - 20:45 #25
super tak :D
Avatar billede fragze Juniormester
20. maj 2006 - 20:46 #26
det virker fint.. morhans svar også, dog ligger den ikke sammen... :)
Avatar billede nielle Nybegynder
20. maj 2006 - 20:59 #27
Den oprindelige kode ville give dig svaret på:

"Hvor mange kampe score playerX i?"

- mens det du ville have var:

"Hvor mange mål scorede playerX i kampene?"

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"
Avatar billede fragze Juniormester
20. maj 2006 - 23:10 #28
Ahaa... Det overvejer jeg at lave min struktur om til. Det virker selfølgelig en del smartere... mange tak for hjælpen!
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