SQL Join

Antispy

Mitglied
Hi Zusammen,

ich habe gerade folgendes Szenario und bin kurz davor zu Verzweifeln.

Ich habe 2 Tabellen in einer Datenbank, welche ich mit einem JOIN verbinden möchte. Als Beispiel:

Tabelle t_car:
ID
Modell
price
...

Tabelle t_color
ID
name
car_ID


So, nun möchte ich auf einer Website mittels JOIN alle autos mit ihrer Farbe ausgeben:

SELECT * FROM t_car LEFT JOIN t_color on t_car.ID=t_color.car_ID.


Aber nun möchte ich gerne eine zweite Tabelle haben, wo ich alle Fahrzege aufliste, welche KEINE Farbe besitzen. Ich dachte ich könnte dieses über ein OUTER JOIN machen, welches aber wenig Sinn machen würde..

Hätte hierzu Jemand eine Idee? Ich wäre Euch sehr, sehr dankbar!

Lieben Gruß,
Antispy
 
Wenn du die Möglichkeit hast, die DB Struktur noch zu ändern, würde ich es eher umgedreht machen, also die Farb ID beim Auto einsetzen und nicht die Auto iD bei der Farbe. Abgesehen von der nun quasi überflüssigen JOIN Abfrage, da du nur eine Tabelle ansprichst, sparst du dir jede Menge Datensätze, da du nicht für jedes Fahrzeug eine neue Farbe anlegen mußt. Da sich die Farben mit Sicherheit wiederholen, erzeugst du jede Menge an Datenredundanz, was bei Änderungen eine gewaltige Fehlerquelle darstellt.
 
Hi,

sorry, das hätte ich dazu sagen müssen:
die Datenbank oben ist nicht die Datenbank ,die ich eigentlich verwende, sondern nur eine Beispieldatenbank, die mir gerade in den Kopf gekommen ist ;) Also bitte nicht darauf achten, wie die DB aufgebaut ist *g*

Mir geht es hauptsächlich um den Join, den ich einsetzen muss, damit ich beide Tabellen miteinander verbinde und NUR die Autos aufzähle, die KEINE Farbe haben.

Gibt es hierzu eine Möglichkeit?

Liebe Grüße,
Antispy
 
Wie oben schon geschrieben - wenn der Farbcode beim Fahrzeug eingetragen ist, brauchst du kein join, ein einfaches where farbe = 0 reicht.
Man solle es sich immer so einfach wie möglich machen.
 
Hi Sprint,

in dieser Hinsicht hast Du auf jeden Fall Recht!
In dem Fall meiner eigentlichen Datenbank sieht das Ganze leider etwas anders aus.

Dann änder ich nun für dieses Beispiel einmal die 2. Tabelle ab:

Tabellenname: t_color_blue
ID
car_ID

Viel Sinn macht solch eine Tabelle jetzt zwar nicht, aber ich versuche damit nur mein Problem zu schildern.
Ich möchte nun einmal alle Autos abgefragt haben, welche die Farbe blau haben (d.h. welche mit ihrer ID in der tabelle t_color_blue eingetragen sind)

Und anschließend möchte ich noch eine 2. Ausgabe haben, wo alle Fahrzeuge aufgelistet werden, welche nicht mit ihrer ID in der Tabelle t_color_blue stehen.

Lieben Gruß,
Antispy
 
Hi,

Du müsstest einen LEFT JOIN machen und nur die Datensätze auswählen, die in der gejointen Tabelle NULL-Werte haben (einfach abfragen, ob t2.id NULL ist).

Abgesehen davon hat Sprint aber recht.

LG
 
Hi,

hier mal 2 gefüllte Tabellen als Beispiel:

t_car
+-------+--------------+
| ID | Modell |
+-------+--------------+
| 1 | VW |
| 2 | BMW |
| 3 | Audi |
+-------+--------------+

t_color_blue
+-------+--------------+
| ID | car_ID |
+-------+--------------+
| 1 | VW |
| 2 | BMW |
+-------+--------------+

Nun möchte ich eine Ausgabe machen mit allen Autos, die eine blaue Farbe haben:
- VW
- BMW

Und dann möchte ich eine Ausgabe machen mit allen Autos, die KEINE Farbe haben:
- Audi

Hier kann ich nun leider keine Abfrage machen, ob ein Eintrag = NULL ist. :(

Lieben Gruß,
Antispy
 
Hi,

hast Du meinen Vorschlag denn überhaupt ausprobiert? Oder hast Du ihn nicht verstanden?

Mach einfach mal einen LEFT JOIN und schau Dir das Ergebnis an. Du bekommst alle Autos, ob sie einen Eintrag in der Farbtabelle haben oder nicht. Bei denen, die keinen haben, sind die Werte der gejointen Farbtabelle NULL. Das machst Du Dir jetzt einfach zunutze.

LG
 
Mache zwar nicht viel mit joins aber so sollte es gehen.

PHP:
$sql="SELECT t_car.* FROM car LEFT JOIN t_color_blue ON modell = car_id WHERE car_id IS NULL;";
 
Hi ihr beiden ;)

Ich habe das vorhin leider nicht ausprobieren können, da ich nicht an meine Sourcen dran kam, aber nun hab ich das mal getestet und es hat wunderbar funktioniert!! :)
Vielen lieben Dank für die nette Hilfe!! :)

Lieben Gruß,
Antispy
 
Zurück