SQL Abfrage

mathiu

Erfahrenes Mitglied
Ich habe eine Tabele MDB_contacts mit Adressen und eine Tabelle MDB_group2c mit Zuordnungen von Gruppen. Ich möchte nun eine Abfrage starten, ob ein Kunde in der einen Gruppe ist und in der anderen nicht.

> SELECT * FROM MDB_contacts as a
> LEFT JOIN MDB_group2c USING(C_ID)
> WHERE
> G_ID != '1M'
> AND G_ID='2F'
>

Das geht leider nicht so.

Ein Datensatz besteht von MDB_group2c besteht aus
C_ID G_ID

Bei einer Abfrage wird C_ID von MDB_group2c mit der C_ID von MDB_contacts verglichen und nebeneinander gestellt, überall wo eine Übereinstimmung vorhanden ist.
Das sieht dann für eine bestimmte Person so aus.
Code:
C_ID first_name last_name ....usw. C_ID    G_ID
 1      hans        meier           1      4EFKI
 1      hans        meier           1        1M
 1      hans        meier           1       7TEST

Die WHERE Abfrage geht nun durch diese Datensätze.
Ich kann also nicht nach GRUPPE AND GRUPPE suchen, weil diese nie auf derselben Linie sind.

Hoffe mal, dass mein Problem verständlich ist.
Die Frage ist nun, ob es eine Möglichkeit gibt, das über eine Abfrage zu lösen, oder ob ich das halt über zwei Abfragen und Verarbeitung im Code machen muss.
 
Wenn die Tabellen über C_ID verknüpft werden können müsste es gehn. Was für eine Datenbank verwendest Du?

So würde ich es mal probieren:
Code:
SELECT *
 
FROM MDB_contact A
INNER JOIN MDB_group2c B
        ON B.C_ID = A.C_ID
 
WHERE B.G_ID != '1M%'
AND B.G_ID = '2F%'
 
Was Du vorhast, lässt sich mit Subqueries und Vergleichen mit IN und NOT IN lösen ... oder mit einem entsprechenden Workaround.

Gruß hpvw
 
Wenn die Tabellen über C_ID verknüpft werden können müsste es gehn.
Nein, meine Abfrage ist falsch. Das wusste ich von Anfang an.
Die vorgeschlagene Abfrage macht grundsätzlich das gleich wie meine und hat deshalb auch die gleichen Probleme.

Was Du vorhast, lässt sich mit Subqueries und Vergleichen mit IN und NOT IN lösen

bezüglich dem, hätte ich vielleicht erwähnen sollen, dass ich MySQL verwende und die Abfrage kompatibel mit 3.x sein sollte, womit Subqueries wegfallen. Aber der Ansatz wäre eine Möglichkeit.

An was für einen Workaround denkst du dabei?
 
mathiu hat gesagt.:
An was für einen Workaround denkst du dabei?
Die meisten Subqueries lassen sich mit JOINs oder LEFT JOINs umschreiben. Wenn es bei einer Einschluss- und einer Ausschluss-Bedingung bleibt, müssten wohl zwei JOINs funktionieren in deren ON-Bedingung Du jeweils eins der Kriterien ergänzt. Für den Ausschluss müßte es ein LEFT JOIN sein und eine Prüfung im WHERE-Teil der Abfrage auf IS NULL. Dabei ist zu beachten, dass Du dann nicht auf Ungleichheit, sondern auf Gleichheit prüfst. Für den Einschluss (Sorry für dieses dämliche Wort, mir fällt gerade nichts anderes zur Abgrenzung ein) sollte ein normaler JOIN herhalten.

Wenn es mehr Bedingungen dieser Art gibt, müsstest Du die JOINs dynamisch im Skript zum Query hinzufügen.

Gruß hpvw
 
Zurück