Probleme mit Select + Join

SirNeo

Erfahrenes Mitglied
Hallo zusammen,

bei einem Select beiße ich mir seit geraumer Zeit die Zähne aus. Es geht um einen Sammlerkatalog.
Kurz zu den Tabellen:
1. Objekttabelle
2. Sprachtabelle bezogen auf das Objekt
3. Userdaten bezogen auf das Objekt

Nun möchte ich alle Einträge ausgeben die der User nicht hat. Bedeutet in der Datenbank, alle Einträge wo die Quantity = 0 ist. Allerdings muss der User keinen Eintrag für ein Objekt haben. Also ist in Tabelle 3 kein Eintrag dafür vorhanden, diese möchte ich aber auch haben, wie kann ich das umsetzen?
Hier mein aktueller Stand:

Code:
SELECT DISTINCT * FROM Objekttabelle AS a, Sprachtabelle AS b left JOIN Userdaten as c ON b.objekt_id = c.objekt_id WHERE a.objekt_id = b.objekt_id AND c.id = '6' AND ( c.quantity = 0 OR c.quantity = NULL) AND a.manf_id = '6' GROUP BY b.objekt_id ORDER BY b.name ASC
Zur Info:
c.id ist die User-ID
a.manf_id ist die Hersteller-Id

Als Ergebnis bekomme ich nun alle Einträge angezeigt, wo ich einen Objekteintrag für habe, also die in c für meinen User vorhanden sind. Mir fehlen aber jetzt die Objekte, die in c nicht exisiteren (solche wo der User noch nie etwas mit gemacht hat).

Ich hoffe ich habe mich verständlich ausgedrückt.

Wäre super, wenn jemand die Frage beantworten könnte.

Viele Grüße und vielen Dank im vorraus
Bastian
 
Hi Bastian,

bei einem LEFT JOIN bekommst Du alle Datensätze aus der "linken" Tabelle mit ihren zugehörigen Daten aus der "rechten" Tabelle oder NULL-Werten, falls es dort keine Einträge gibt. In Deiner WHERE-Klausel schränkst Du nun aber u.a. auf c.id = 6 ein. Damit fallen die Objekte, bei denen die User-Werte NULL sind, aus dem Ergebnis raus. ;)

SQL:
SELECT DISTINCT * FROM Objekttabelle AS a, 
   Sprachtabelle AS b 
   left JOIN Userdaten as c 
      ON b.objekt_id = c.objekt_id 
   WHERE a.objekt_id = b.objekt_id 
      AND c.id = '6'  /* hier schränkst Du auf vorhandene Einträge (id = 6) ein !! */
      AND ( c.quantity = 0 OR c.quantity = NULL) 
      AND a.manf_id = '6' 
   GROUP BY b.objekt_id 
   ORDER BY b.name ASC

Und bitte formatiere doch das nächste Mal den Code in eine ordentliche Struktur. Längere SQL-Abfragen auf einer einzigen Zeile ohne Syntax Highlighting, bei denen man meterweit scrollen muss, sind praktisch unlesbar.

LG
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

erst einmal vielen Dank für deine Hilfe, jetzt bin ich schon einen Schritt weiter.
Ich habe das wie unten geändert, jetzt sind die NULL Einträge auch mit dabei.

SQL:
SELECT DISTINCT * FROM Objekttabelle AS a,    
Sprachtabelle AS b    
LEFT JOIN Userdaten AS c       ON b.objekt_id = c.objekt_id    
WHERE a.objekt_id = b.objekt_id       
AND ( c.id = '6'  OR c.id = NULL)
AND ( c.quantity = 0 OR c.quantity = NULL)       
AND a.manf_id = '6'    
GROUP BY b.objekt_id    
ORDER BY b.name ASC

Ein Problem habe ich noch, jetzt schließt er die Einträge die nicht mit meiner ID oder NULL vorhanden sind (c.id) aus, mir leuchtet auch ein warum, nur wie kann ich das umgehen? Hat dazu jemand eine Idee?

Diesmal mit Formatierung :)

Viele Grüße
Bastian
 
Zuletzt bearbeitet von einem Moderator:
Hi,

meinst Du das vielleicht so?

SQL:
SELECT DISTINCT * FROM Objekttabelle AS a,    
   Sprachtabelle AS b    
   LEFT JOIN Userdaten AS c 
      ON b.objekt_id = c.objekt_id    
   WHERE a.objekt_id = b.objekt_id       
      AND (c.id = NULL OR (c.id = 6 AND c.quantity = 0))
      AND a.manf_id = '6'    
   GROUP BY b.objekt_id    
   ORDER BY b.name ASC

Diesmal mit Formatierung :)

Schon besser. ;)

LG
 
Zuletzt bearbeitet von einem Moderator:
Das ist nochmal eine zusätzliche Optimierung :) vielen Dank.

So ganz ist es doch noch nicht richtig. Und zwar werden jetzt Obejkte die andere User bereits haben nicht mehr angezeigt. Ist auch logisch. Die c.id ist nicht NULL oder 6 sondern irgendetwas anderes.
Bin mir so langsam nicht mehr sicher, ob ich da nicht besser zwei Select draus machen muss, ob es mit einem überhaupt möglich ist. Oder hat noch jemand eine Idee?

Vielen Dank nochmal
Bastian
 
Hi,

pack mal die Einschränkung auf den User in die JOIN-Bedingung:

SQL:
SELECT DISTINCT * FROM Objekttabelle AS a,    
   Sprachtabelle AS b    
   LEFT JOIN Userdaten AS c
      ON b.objekt_id = c.objekt_id AND c.id = 6   
   WHERE a.objekt_id = b.objekt_id      
      AND (c.id IS NULL OR c.quantity = 0)
      AND a.manf_id = '6'    
   GROUP BY b.objekt_id    
   ORDER BY b.name ASC

LG
 
Zurück