[PHP|SQL] Abfrageproblem

LoseAndMore.de

Well-known member
ID: 12911
L
20 April 2006
292
8
Ich habe 2 Tabellen,
einmal die Tabelle: spiele
dort steht drin welche Spiele es alles gibt:
id, spielname, spielstart, mitspieler
Erklärung: id=autoinc,spielname=name des spiels, spielstart=wann startete das spiel, mitspieler=anzahl der mitspieler

und die Tabelle: mitspieler
mit den Spalten
id, userid, spieleid, spielerstart
Erklärung: id autoinc, userid = die ID des Users, spieleid=id von spiele, spielerstart= wann hat der user angefangen mitzumachen

Die Abfrage in welchen Spielen ein User bereits teilnimmt habe ich mit:
$select=mysql_query("SELECT spiele.id, spielname, mitspieler, spielstart FROM spiele, mitspieler WHERE mitspieler.spieleid = spiele.id AND mitspieler.userid ='$userdaten[id]' ORDER BY spiele.spielstart", $db);

abgefangen.

Was nun jedoch das Problem ist und ich mit diversen Ansätzen scheiter ist,
die Abfrage um die Spiele darzustellen in welchen der User noch nicht mitspielt.

LG
 

flaschenkind

Well-known member
ID: 118459
L
20 April 2006
4.507
337
Die Query die du verwendest, ist nicht so schlau, ich würde dort einen Join verwenden, da du damit eine bessere Performance erziehlst. Im Grunde machen die Querys das gleiche, nur dass deine Query alle Einträge ausliest und dann filtert, und der Join sofort filtert und nur das benötigte ausliest.
PHP:
SELECT `spiele`.id, `spiele`.`spielname`, `spiele`.`mitspieler`, `spiele`.`spielstart` FROM `spiele` LEFT JOIN `mitspieler` ON `spiele`.`id`=`mitspieler`.`spieleid` WHERE `mitspieler`.`userid`=1 ORDER BY `spiele`.`spielstart`

Zu deiner Frage:
PHP:
SELECT `spiele`.id, `spiele`.`spielname`, `spiele`.`mitspieler`, `spiele`.`spielstart` FROM `spiele` LEFT JOIN `mitspieler` ON `spiele`.`id`!=`mitspieler`.`spieleid` WHERE `mitspieler`.`userid`=1 ORDER BY `spiele`.`spielstart`
 

marac

Well-known member
ID: 272843
L
1 Februar 2007
2.060
321
Zu deiner Frage:
PHP:
SELECT `spiele`.id, `spiele`.`spielname`, `spiele`.`mitspieler`, `spiele`.`spielstart` FROM `spiele` LEFT JOIN `mitspieler` ON `spiele`.`id`!=`mitspieler`.`spieleid` WHERE `mitspieler`.`userid`=1 ORDER BY `spiele`.`spielstart`
Nee, das geht schief! Da bekommst du ja dann eine Zeile pro Spiel und Mitspieler, und auch die Spiele, bei denen 1 schon dabei ist, tauchen dann nochmal auf, wenn noch andere Leute dabei sind...

Wie wäre es mit
PHP:
SELECT id, spielname, mitspieler, spielstart
FROM spiele
WHERE id NOT IN (SELECT spieleid FROM mitspieler WHERE userid ='$userdaten[id]')