MySQL SELECT: alles auswählen außer DIESES

mogliNG

Grünschnabel
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
 
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
 
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:
Code:
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
 
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"....
 
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
 
Zurück