• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Gegenteil von INNER JOIN?

marlin-b

Neues Mitglied
Hallo HTMLer,
ich habe folgendes Problem. Ich habe eine Tabelle 'sync' mit den Attributen 'syncid' und 'id'. In 'syncid' steht die ID des Programms mit dem es synchronisiert wurde und in 'id' die Datei.
Jetzt möchte ich eine Liste zusammenstellen, die mir alle Dateien auflistet die mit einer bestimmen 'syncid' noch nicht synchronisiert wurden.
Code:
SELECT name, id, syncid
FROM `user_files` 
INNER JOIN `details` ON `user_files`.`id` = `details`.`id`
LEFT JOIN `sync` ON `user_files`.`id` = `sync`.`id`
WHERE `userid` = 1
ORDER BY `user_files`.`id` DESC

Das Problem ist, wenn ich prüfe ob 'syncid' != "abs" wird ein andere Eintrag genommen wo `user_files`.`id` = `sync`.`id`

Wie kann ich die Abfrage so umstellen, dass wenn in `sync` `syncid` gefunden wird der Eintrag nicht genommen wird. (Unterabfrage?)
 
Werbung:
Sieh die INNER LEFT JOOIN, OUTER LEFT JOIN und die passenden RIGHT JIONS man genauer an.
 
Die Lösung ist doch einfacher als gedacht.

Code:
WHERE `userid` =1
AND NOT EXISTS (
   SELECT id
   FROM `sync` 
   WHERE `syncid` = 'abc'
   AND `id` = `userfiles`.`id` 
)
 
Werbung:
Das geht auch mit einem select ;)

Suche mal nach isnull :)
Das benutzt du in der where clause.

select * from t1
left join t2
on t1.id=t2.id
where
isnull(t2.id)
 
In mysql eher so:

Code:
select * from t1
left join t2
on t1.id=t2.id
where t2.id IS NULL
 
Danke Asterixus, dass du dir nochmal Gedanken zu meiner Fragestellung gemacht hast. Das Problem bei deiner Lösung ist, dass sobald ein Programm in "t2" die Datei synchronisiert hat kein weiteres Programm diese synchronisiert.

Marlin
 
Werbung:
Danke Asterixus, dass du dir nochmal Gedanken zu meiner Fragestellung gemacht hast. Das Problem bei deiner Lösung ist, dass sobald ein Programm in "t2" die Datei synchronisiert hat kein weiteres Programm diese synchronisiert.
Das versteht keiner. Was hat das mit deiner Fragestellung zu tun?
 
Werbung:
ich habe folgendes Problem. Ich habe eine Tabelle 'sync' mit den Attributen 'syncid' und 'id'. In 'syncid' steht die ID des Programms mit dem es synchronisiert wurde und in 'id' die Datei.
Jetzt möchte ich eine Liste zusammenstellen, die mir alle Dateien auflistet die mit einer bestimmen 'syncid' noch nicht synchronisiert wurden.

und genau das was du willst, liesse sich mit der obigen Abfrage umsetzen, in etwa so:

Code:
SELECT name, id, syncid
FROM `user_files` LEF JOIN
 `details` USING(`id`)
LEFT JOIN `sync`  USING(`id`)
WHERE `sync`.`id` IS NULL
So bekommst du alle IDs die noch nicht synchronisiert wurden, wenn ich deine Schilderungen richtig verstanden habe.
 
Werbung:
Das ist doch das was du machst? != 'abc' ist z.b. 'aex'
Du weißt was das != bedeutet?
 
Werbung:
Das ist doch das was du machst? != 'abc' ist z.b. 'aex'
Du weißt was das != bedeutet?

Wie soll ich denn deiner Meinung nach die Bedingung aufschreiben, damit alle Dateien angezeigt werden die mit "abc" noch nicht synchronisiert wurden?
mit WHERE 'syncid' != "abc" bin ich nicht viel schlauer als vorher...
 
Wenn dich dich richtig verstehe, suchst du vermutlich sowas

Code:
SELECT name, id, syncid
FROM `sync`
RIGHT JOIN  `user_files`  ON `user_files`.`id` = `sync`.`id`
WHERE syncid = 'abc' AND user_files.id IS NULL

Also alle Datensätze die mit syncid = 'abs', aber wo noch keine id in user_files gesetzt wurde.
 
Werbung:
Stimmt, scheint es aber auch nicht immer zu geben. Es gibt noch eine Funktion IFNULL() - viele Wege führen nach Rom
 
Zurück
Oben