3 messages in com.mysql.lists.mysql-deRe: join oder nicht join
FromSent OnAttachments
Alex30 Nov 2005 03:15 
Felix Antonius Wilhelm Ostmann30 Nov 2005 03:46 
Rene Fertig30 Nov 2005 07:29 
Subject:Re: join oder nicht join
From:Rene Fertig (re@renux.de)
Date:11/30/2005 07:29:25 AM
List:com.mysql.lists.mysql-de

Am Mittwoch, 30. November 2005 12:16 schrieb Alex:

in meinem kleinen fiktiven Bsp. habe ich eine Tabelle mit artikel und eine Tabelle mit customer.

Struktur der artikel Tabelle artid | custid 1 | 5 3 | 5 12 | 8

Struktur der customer Tabelle userid | name 5 | heinz 8 | franz

Nun möchte ich aus der artikel Tabelle alle artid die z.b. heinz gekauft hat. Außerdem noch den Namen des Käufers, also heinz.Ich versuche dies mit:

SELECT artid, name FROM artikel, customer WHERE artikel.custid=customer.userid AND custid=5 Nun mein Problem. Ist der Customer heinz nicht mehr vorhanden erhalte ich kein Ergebnis mehr da "AND custid=5" ja nicht erfüllt ist.

Daran liegt das nicht, denn in artikel gibts ja die custid 5 noch. Es liegt mehr an der Bedingung artikel.custid=customer.userid in der Where-Clause. Daher musst du mit einem LEFT-Join arbeiten (s.u.).

Aber, wie Felix ja schon anmerkte, ist es eigentlich nicht üblich, das Einträge verschwinden (oder gelöscht werden), wenn es in anderen Tabellen noch Bezüge darauf gibt. Ich würde eher in der customer-Tabelle eine Spalte "Status" anlegen, durch die nicht mehr aktive Kunden mit "inaktiv" o.ä. gekennzeichnet werden.

Wie kann ich nun die Abfrage so gestalten, dass wenn der User nicht mehr vorhanden ist ich nur die artikel abfrage, die der custid 5 zugeordnet sind?

SELECT artid, name FROM artikel LEFT JOIN customer ON artikel.custid=customer.userid WHERE custid=5

Da steht dann in dem o.g. Fall halt NULL in name, weil kein Datensatz dazu gefunden wurde.

Ciao, René

----------------------------------------------------------------------