1.9k Aufrufe
Gefragt in Datenbanken von klassenkasper Einsteiger_in (65 Punkte)
Aloha Supportnetler
Ich arbeite an einem kleinen Projekt zu einem Spiel zur Ausgabe von Daten aus einer MySQL Datenbank.
Ich zermarter mir seit 2 Tagen das Hirn, aber ich komme nicht vorwärts. Ich hab in der Datenbank 2 Tabellen die ich mit einen Join ansprechen will. Aber die Ergebnismenge entspricht nicht dem was ich haben will.
Zum Aufbau: In der einen Tabelle stehen die Fahrzeuge des Spiels, in einer zweiten Tabelle die ID´s der Fahrzeuge die sich im Besitz des Benutzers befinden. In dieser Tabelle werden lediglich Benutzername und ID des Fahrzeugs gespeichert.
Aus der Fahrzeugtabelle wird ein HTML Formular generiert, in dem der Benutzer mit Checkboxen anhaken kann welches Fahrzeug er besitzt. Als Value der Checkboxen wird die jeweilige ID des Fahrzeugs in der Datenbank gesetzt, und beim Absenden des Formulars zusammen mit dem Benutzernamen in die zweite Tabelle geschrieben. Für jedes Fahrzeug ein Eintrag. Da es maximal 29 Fahrzeuge gibt, werden in der Tabelle für jeden User maximal 29 Einträge gemacht.
Jetzt möchte ich gerne, wenn für den Benutzer ein Eintrag in dieser Tabelle vorhanden ist, die Fahrzeugliste so generieren das ihm Fahrzeuge, die er bereits besitzt, nicht mehr angezeigt werden. Dazu benutze ich folgende Abfrage:
SELECT name, tech FROM tankliste INNER JOIN tankliste.ID != liste.tank

Mein Problem ist, dass er bei dieser Abfrage 280 Ergebnisse raushaut, obwohl es eigentlich nur 20 sein sollten. Nämlich die, die der Benutzer nicht besitzt. Aber irgendwie funktoniert dieses "tankliste.ID != liste.tank" nicht.
Meine Frage wäre, wie muss ich die Abfrage stricken das er mir nur noch die Fahrzeuge anzeigt, die der Benutzer nicht besitzt?
Über einen Wink mit dem Zaunpfahl wäre ich sehr froh :)

Gruß
Des Kasperli

5 Antworten

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hi,

Das angegebene SQL kann so gar nicht funktionieren, ist syntaktisch falsch. Was steht denn für ein Wert in der Variablen liste.tank?

Gruss Ralf
0 Punkte
Beantwortet von klassenkasper Einsteiger_in (65 Punkte)
Hi Ralf
In der Variablen liste.tank stehen die ID´s der Fahrzeuge aus der tankliste, die der Benutzer bereits in seinem Besitz hat.
Mit der gleichen Abfrage kann ich die Fahrzeuge ausgeben lassen, die der Benutzer eingetragen hat, wenn ich hinten "tankliste.ID = liste.tank" setze. Nur wenn ich hinten mit ungleich arbeite, bekomme ich zuviele Ergebnisse.

Gruß Kai
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Kay,

Dein sql kann nix vernünftiges liefern. Wenn in liste.tank ein String mit IDs enthalten ist, die mit Komma separiert sind, so muss zumindest dein sql ansatzweise mit . . . Where tank.id in ( “ & liste.tank & “ ). . . lauten. Mit welcher Programmiersprache bist du unterwegs?

Gruss Ralf
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Kai (nunauch mit i),

jetzt sitze ich an einem Rechner mit richtiger Tastatur, ist einfacher als mit einem Smartphone ...
Also wenn deine Variable liste.tank sowas enthält wie "1, 3, 27, 45", dann kannst du einen SQL-String zusammen basteln mit

strSQL = "SELECT name, tech FROM tankliste WHERE tank.id in ( " & liste.tank & " );"
, dann enthält strSQL folgenden Wert

SELECT name, tech FROM tankliste WHERE tank.id in (1, 3, 27, 45);

Das ist ein valider, ausführbarer SQL-Code, der von jeder vernünftigen DB korrekt interpretiert wird, vorausgesetzt die Tabelle existiert mit diesen Variablen.

Gruß
Ralf
0 Punkte
Beantwortet von klassenkasper Einsteiger_in (65 Punkte)
Hi Ralf
Der Hinweis mit dem "WHERE IN" war der Schlüssel zum Erfolg :)
Ich hab mir daraufhin nochmal das MySQL Manual angeschaut und rausgefunden, dass ich bei IN() mit einem Subselect arbeiten kann. Deswegen lautet der Query nun so:
SELECT * from tankliste
WHERE ID NOT IN
(SELECT tank FROM liste WHERE user="'.$user.'")
ORDER BY nation, tier DESC

Damit erhalte ich genau das Ergebnis was ich haben will: Die Fahrzeuge die der Benutzer noch nicht eingetragen hat :)
Umgesetzt wird das ganze mit PHP, ich teste die Querys aber vorher in der Datenbank, daher habe ich das unter Datenbanken hier im Forum eingetragen. In PHP wird die MySQL Syntax ja 1:1 übernommen.

Danke dir für den Zaunpfahl *daumenhoch*

Gruß
Kai
...