# MySQL SELECT: alles auswählen außer DIESES



## mogliNG (7. Juli 2004)

Ich habe 3 Tabellen und weiß wie ich das selektiere was ich NICHT brauche.
Kann ich die Selektion umkehren, d.h. alles was ich nicht mit meiner Bedingung beschrieben habe?

Kurze Erklärung:
Ich habe 3 Tabellen:
- mypages (mit allen pages meiner Website)
- mylinks (mit allen Links die auf meiner Website benutzt werden)
- linksOnEachPage (wo zu jeder "mypage.id" beliebig viele mylinks.id aufgeführt sind)

Letztere Tabelle nennt man wohl Interselektionstabelle.

Beispiel für "linksOnEachPage":
id, page_id, link_id

1, 3, 3
2, 3, 8
3, 4, 7
4, 4, 6
5, 4, 5

Ich führe für Page-Nr. 4 folgende aus:
"SELECT DISTINCT mylinks .* FROM mylinks, linksOnEachPage  WHERE mylinks .id=linksOnEachPage.link_id AND linksOnEachPage.page_id=4"

und erhalte
3, 4, 7
4, 4, 6
5, 4, 5

jetzt möchte ich diese Abfrage umkehren, so das ich alle Links erhalte, die dieser Regel nicht entsprechen. 

Achtung! Alle restlichen Links, d.h. 1-n ohne 7,6 und 5.
Achtung! Es ist keine Pflicht, das die restlichen Links bereits in linksOnEachPage aufgeführt werden.

Ich hoffe, ich konnte erklären was mein Problem ist.
Ich hoffe es kann mir jemand helfen.

Gruß
MogliNG


----------



## vyanna (8. Juli 2004)

Hallo,

bin nicht ganz sicher ob ich dein Problem wirklich verstanden hab, aber wenn du einfach nur die umkehrung willst, dann nimm doch statt "=" einfach "!="

oder war das anders gemeint?

Gruß, vyanna


----------



## Sven Petruschke (8. Juli 2004)

Wenn ich Dein Problem richtig verstehe, dann musst Du zunächst die Abfrage ausführen, die Dir die Daten zurück gibt, die Du eigentlich nicht haben möchtest. Also:
3, 4, 7
4, 4, 6
5, 4, 5

Danach stellst Du die Daten so zusammen, dass sie in die Form kommen:
(3,4,5,6,7)

Die Reihenfolge ist egal und doppelte Zahlen machen auch nichts.

Danach erstellst Du eine neue Abfrage, die wiefolgt aussieht: 
	
	
	



```
SELECT DISTINCT mylinks .* 
FROM mylinks, linksOnEachPage 
WHERE mylinks .id=linksOnEachPage.link_id 
  AND linksOnEachPage.page_id  not in (3,4,5,6,7)
```
 Somit schliesst Du alle Datensätze aus, die als page_id irgendeine Nummer der ersten Abfrage haben.

snuu


----------



## mogliNG (8. Juli 2004)

> _Original geschrieben von vyanna _
> *Hallo,
> wenn du einfach nur die umkehrung willst, dann nimm doch statt "=" einfach "!="
> *



Das war auch meine erste Überlegung. Probiere es doch mal aus - es bringt nicht das Ergebnis welches ich anstrebe. Es liefert nur "Bandsalat"....


----------



## mogliNG (8. Juli 2004)

Vielen dank snuu das ist ein guter "workaround".



			
				snuu hat gesagt.:
			
		

> [...]die Abfrage ausführen, die Dir die Daten zurück gibt, die Du eigentlich nicht haben möchtest. Danach stellst Du die Daten so zusammen, dass sie in die Form kommen: (3,4,5,6,7)Danach erstellst Du eine neue Abfrage Somit schliesst Du alle Datensätze aus, die als page_id irgendeine Nummer der ersten Abfrage haben.



MySQL kann doch rechnen... kann man alle Ergebnisse deiner ersten Abfrage gleich als String in der Form (3,4,5,6,7) erstellen lassen? D.h. so das nur ein einziger Datensatz als Ergebnis zurückgeliefert wird.

Schöner und warscheinlich schneller müßte es mit einer reinen MySQL-Lösung gehen, oder gibt keine für meinen Fall?

Kann man Abfragen in einander verschachteln (SELECT in SELECT) oder das Ergebnis eines JOINs innerhalb der aktuellen MySQL-Abfrage in einer "nachgeschalteten" Bedingung verwenden?

Ich finde das ist echt eine harte Nuß.
Gruß und Danke
MogliNG


----------

