# Selektion umkehren



## morgenstern (4. Oktober 2004)

Hi!

ich habe folgende Datenbankstruktur:

Tabelle 1:
ID
kategorie

Tabelle 2:
ID
kategorieID
userID

Ich habe nun einem User 2 von 4 Kategorien zugeordnet, im Adminmenü möchte ich jetzt aber beim Hinzufügen einer Kategorie zu einem User, nur jene Kategorien zur Auswahl haben, welche er noch nicht hat.

Zur Auswahl welche er schon hat nehme ich dieses SELECT:


```
SELECT * FROM tabelle_1 inner join tabelle_2 on tabelle_1.ID = tabelle_2.kategorieID WHERE tabelle_2.userID = $userID
```

Die variable $userID wird übergeben.(Den * wähle ich nur im forum, damit der Befehl kürzer bleibt)

Das Resultat ist, dass jene Kategorien aufgelistet werden, die dieser User besitzt.
Jetzt möchte ich dieses Ergebnis umkehren, nur jene anzeigen, die dieser User nicht besitzt, und diese in ein Pulldownmenü ausgeben (Das Pulldownmenü ist kein Problem  )

Ich stehe irgendwie auf der Leitung. 

Danke im voraus.


----------



## TVE (4. Oktober 2004)

SELECT * FROM tabelle_1 RIGHT JOIN tabelle_2 on tabelle_1.ID = tabelle_2.kategorieID WHERE tabelle_2.userID = $userID AND tabelle_1.ID is NULL


----------



## morgenstern (4. Oktober 2004)

Danke.

Ich verstehe zwar wieso "is NULL" (Platzhalter) jedoch funktioniert es nicht, bekomme keine Ausgabe. Bei "is NOT NULL" bekomme ich aber eine Ausgabe.

Jetzt verstehe ich nicht was nicht funktioniert.


----------



## TVE (4. Oktober 2004)

Hast du gesehen, dass ich aus deinem INNER JOIN einen RIGHT JOIN gemacht habe? Ohne den funktioniert das nicht, was du machen willst.


----------



## TVE (4. Oktober 2004)

Oha... muss nochmals den query überarbeiten... man sollte die DB erst nachbauen, bevor man Müll erzählt. 

Ich richte es nach meinem Mittagessen ok?


----------



## morgenstern (4. Oktober 2004)

Natürlich habe ich das gesehen. Ich habe deine Zeile kopiert und angepasst.

Kein Problem. Mahlzeit


----------



## TVE (4. Oktober 2004)

So jetzt hab ichs... (Mannomann... manchmal frag ich mich über mich selbst):

SELECT tabelle_1.kategorie FROM tabelle_1 LEFT JOIN tabelle_2 ON tabelle_1.ID = tabelle_2.kategorieID WHERE tabelle_2.userID != $userID OR tabelle_2.userID is NULL

So, das geht definitiv!

Bei der Variable musst halt gegebenenfalls noch aufpassen wegen den Anführungszeichen, aber ich glaub, das ist dir auch klar.


----------



## morgenstern (4. Oktober 2004)

Jop das geht. Nur habe ich jetzt im Pulldownmenu jede Kategorie so oft, wie user drinnen stehen, die zu dieser Kategorie gehören 

Meine logische Lösung:

Alle Kategorien hernehmen, alle Kategorien des Users hernehmen -> diese aus dem Pulldownmenü entfernen.

Nur wie?


----------



## TVE (4. Oktober 2004)

Ah, kein Problem, einfach ein DISTINCT vorneranhängen:
SELECT DISTINCT tabelle_1.kategorie FROM ... etc.

[Edit] Vergiss das... geht so nicht... [/EDIT]


----------



## BSA (4. Oktober 2004)

Ich wills nur mal versuchen, testen musst du selber:


```
SELECT tabelle_1.kategorie FROM tabelle_1 LEFT JOIN tabelle_2 ON tabelle_1.ID = tabelle_2.kategorieID WHERE tabelle_2.userID != $userID OR tabelle_2.userID is NULL GROUP BY kategorie
```


----------



## TVE (4. Oktober 2004)

Wenn du MySQL mit der 4.1 Version hast, könnte man es mit einen Subquery versuchen. Da ich das nicht hab (hab den Server seit März nicht mehr upgedated) und im Moment einen Haufen Kunden auf unsere DB zugreifen, kann ich das Teil jetzt nicht installieren.

Meiner Meinung nach müsste so was wie das funktionieren, keine Garantie:
SELECT  tabelle_1.kategorie 
FROM  `tabelle_1` 
INNER  JOIN tabelle_2 ON tabelle_1.id = tabelle_2.kategorieid
WHERE userid <> 
( SELECT userid FROM tabelle_2 WHERE userid =$userid  ) 

Versuch das mal, wenn du MySQL 4.1 oder höher hast. Sonst kannst das gleich wieder vergessen.


----------



## morgenstern (4. Oktober 2004)

Das mit group by hat funktioniert danke. Ich habe leider kein 4.1 zur Verfügung, kann ich es also nicht testen  Werds später zu Hause ausprobieren.

Danke für die Mühe TVE!

thx BSA.


----------

