SUB Queri mit Bedingung im Sub Query
Stefan Schälle
- datenbank
0 Rouven
Hallo Zusammen
Habe das Problem das es in MySql ja noch keine Sub Qerys gibt, jedoch habe ich nur eine Anleitung gefunden, in welcher sich keine Bedingungen im Sub definieren lassen.
The queries:
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);
Can be rewritten as:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
Die funktioniert auch. Wenn ich jetzt aber auch noch in der Tabelle table2 z.B. plz = '9999' dann funktioniert das ganze nicht mehr.
Kann mir jemand da weiterhelfen, oder muss ich das mit einer temp Tabelle machen???
Besten Dank schon im vorherein.
Gruss Stefan
Hi,
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
Diese Lösung basiert darauf, dass der LEFT JOIN bei einer Nicht-Übereinstimmung der IDs (also wenn sich kein passender Datensatz findet) eine leere ID bei table2.id hinterlässt
id1 id2
1 1
2 2
3 -
Aus diesem Ding bleibt jetzt also nur die Zeile über, bei der diese id2 NULL ist, demnach die Zeile mit der 3.
Die funktioniert auch. Wenn ich jetzt aber auch noch in der Tabelle table2 z.B. plz = '9999' dann funktioniert das ganze nicht mehr.
Was hast du jetzt hiermit vor?
SELECT * FROM tab1 WHERE id NOT IN (SELECT * FROM tab2 WHERE plz='9999')
Lass mich mal basteln:
SELECT * FROM tab1 LEFT JOIN tab2
ON tab1.id = tab2.id
WHERE tab2.id IS NULL
OR tab2.plz <> '9999'
Ich behaupte, auf diese Weise sorgt er dafür, dass nur die Datensätze überleben, deren ID gar nicht in tab2 vorkommen, oder aber diejenigen die zwar vorkommen, bei denen aber die zugehörige PLZ toleriert wird...
Aber ist nur ein Versuch - Ich liebe Subqueries und andere DBMS...
MfG
Rouven
Also,
Habe deinen Versuch auch mal ausprobiert, hat aber nicht ganz das gwünschte Ergebniss gegeben. Also hier noch die orginal Abfrage:
SELECT messenger\_user\_to\_user
.user\_nr
FROM messenger\_user\_to\_user
WHERE messenger\_user\_to\_user
.user\_nr
NOT IN (SELECT messenger\_user\_to\_forum
.user\_nr
FROM messenger\_user\_to\_forum
WHERE messenger\_user\_to\_forum
.topic\_nr
= '$topic_nr') AND (messenger\_user\_to\_user
.to\_user\_nr
= '$user_id')
Hier einmal eine LEFT JOIN Abfrage mit einer bedingung in der Join Tabelle:
SELECT
messenger\_user\_to\_user
.user\_nr
,
messenger\_user\_to\_forum
.user\_nr
AS field1
FROM
messenger\_user\_to\_user
LEFT JOIN messenger\_user\_to\_forum
ON (messenger\_user\_to\_user
.user\_nr
= messenger\_user\_to\_forum
.user\_nr
)
WHERE
(messenger\_user\_to\_forum
.topic\_nr
= '43') AND
(messenger\_user\_to\_user
.to\_user\_nr
= '2')
Funktioniert eben schon nicht. Habe es auch mit (messenger\_user\_to\_forum
.topic\_nr
= '43' OR messenger\_user\_to\_forum
.topic\_nr
IS NULL) versucht, hat aber auch nicht das gewünschte Ergebniss gebracht.
Merci für deine Hilfe und ein Gruss aus der Schweiz
Stefan
Und jetzt musst du mir mal auf die Sprünge helfen, was heißt bei dir es funktioniert nicht? Fehlermeldung oder falsches Ergebnis?
Du könntest auch noch versuchen, das Kriterium im ON-Teil des JOINS unterzubringen:
FROM messenger_user_to_user LEFT JOIN messenger_user_to_forum
ON (messenger_user_to_user.user_nr = messenger_user_to_forum.user_nr
AND messenger_user_to_forum.topic_nr <> 43)
^^^^
oder OR
Ausprobieren....
MfG
Rouven
Supper, merci.
Du warst meine Rettung.
Das stand ganz klein in der Referenz und es hat doch auch wirklich funktioniert.
Merci und noch einen schönen Abend.
Gruss Stefan
PS: Man hat wohl nie Ausgelernt