Ausschließen von 2 Datensätzen
-
Ich hab 2 Tabellen. Eine Tabelle mit Kunden und eine wo Kunden und Artikel zusammen geführt wurden.
So jetzt rufe ich ab welche Kunden einen bestimmten Artikel haben.
Aber jetzt muss ich auch noch ausgeben welche Kunden diesen Artikel NICHT haben.Habs versucht mit ner Schleife zu lösen, aber da es ja mehrere Kunden gibt die einen Artikel haben, funktioniert das nicht, da immer nur der eine Kunde ausgeschlossen wird bei der NOT Anweisung und die Anzahl der Kunden pro Artikel kann variieren, somit kann ich keine statische Lösung erstellen.
Ich benutze PHP.
Danke
MFG
-
Lässt sich wohl noch optimieren, aber wenn ich dich richtig verstanden habe, könntest du es mal so versuchen:
SELECT tab1.kunr, (SUM(tab2.prodid = 1) = 0 OR SUM(tab2.prodid = 1) IS NULL) AS cond FROM tab1 LEFT JOIN tab2 USING (kunr) GROUP BY tab1.kunr ORDER BY cond, kunr ASC
Jetzt liest du einfach alle Zeilen aus, bis cond = 1
-
Hmm ich versteh das nich so ganz wie du das meinst.
Hab das jetzt aber auch mit ner Left Join gemacht.
Sieht folgendermaßen aus:$sql = "SELECT Kunde FROM Kundentab LEFT JOIN Kunde_Artik ON ID_Kund <> ID_Kund";
So aber das klappt noch net ganz. Hoffe du kannst mir etwas genauer erklären was ich da noch hinzufügen muss.
Danke
MFG
-
Also, dann erläutere ich meinen SQL-Befehl mal ein wenig (die Bezeichnung der Tabellen und Spalten musst du ggf. noch selbst ein wenig anpassen):
SELECT Kundentab.ID_Kund, Kunde, (SUM(Kunde_Artik.ID_Atrik = 1) = 0 OR SUM(Kunde_Artik.ID_Atrik = 1) IS NULL) AS artikel_gekauft FROM Kundentab LEFT JOIN Kunde_Artik USING (ID_Kund) GROUP BY Kundentab.ID_Kund ORDER BY artikel_gekauft, Kunde ASC
Zunächst fügst du über den LEFT JOIN deine beiden Tabellen zusammen, dabei wird die Spalte ID_Kund als Bindungsglied verwendet. Es wird also für jede Zeile aus der ersten Tabelle (Kundentab) mind. eine Zeile angelegt, und mit dem entsprechenden Eintrag der zweiten Tabelle (Kunde_Artik) verknüpft. Existiert dort kein Eintrag zu einer ID, so wird die Zeile einfach mit NULL aufgefüllt, existieren dort mehrere Einträge zu einer Kunden-ID, so wird für jeden Eintrag eine Zeile angelegt. Nun kannst du über "GROUP BY Kundentab.ID_Kund" diese wieder zu einer Zeile zusammenfügen. Dabei kannst du mit Funktionen wie COUNT, SUM, etc. festlegen, wie die ggf. zusammengefassten Werte einer Spalte in einen einzigen Wert umgewandelt werden. Ich habe also eine Spalte "Kunde_Artik.ID_Atrik = 1" (statt 1 eben die ID angeben, für die du die Kunden haben willst, welche diesen Artikel nicht gekauft haben) erzeugt, in der ich nun aus der Artikel-ID einen Wert mache, ob es der auszufilternde Artikel ist (1) oder ein anderer Artikel (0). Werden nun alle Artikel eines Kunden in dieser Weise mit SUM zusammengefasst, siehst du, wie oft der Kunde den Artikel gekauft hat - falls der Kunde jedoch noch gar nichts gekauft hat, gibt es keine passende Zeile in Kunde_Artik und in der Spalte steht NULL. Also nun noch schauen, ob in der Spalte NULL oder 0 steht (das gibt dann 0) oder was anderes (das gibt dann 1). Damit man dann noch im ORDER BY gut nach der Spalte sortieren kann, habe ich ihr noch mit "AS artikel_gekauft" eine kurze Bezeichnung gegeben. Nach dem "ORDER BY artikel_gekauft, Kunde ASC" hast du nun also in der Tabelle ober die ganzen Kunden stehen, die den Artikel noch nicht gekauft haben (in alphabetischer Reihenfolge) und darunter die, die ihn schon gekauft haben (auch alphabetisch sortiert).
So, hoffe das wurde jetzt alles etwas klarer - geht vielleicht auch noch eleganter, sollte aber zumindest mal funktionieren...
-
Hmm das klappt irgendwie nich ganz.
Hab jetzt noch eine andere, vllt auch unschönere Weise gefunden.
Habs mit einer Having Not In gemacht.
Also eine verschachtelte Anweisung erstellt. Geht eigentlich auch ganz gut.
Trotzdem danke für die Hilfe!!!!
MFG