ErWeissEsNicht: Distinct richtig ??

Hallo zusammen!

Ich habe drei tabellen, in einer sind die Kunden, in einer die kundengruppen und in der letzten die verknüpfung kundengruppe zu kunde.

Jetzt möchte ich alle kunden zu verschiedener Kundengruppen herausbekommen.
Kunden können auch mehreren Kundengruppen angehören.

Wenn ich jetzt z.B. alle Kunden der Gruppe 1,2 und 3 auslese, klappt das auch, allerdings können Kunden dann ja auch doppelt aufgelistet werden.

Ist Distinct dann der Richtige Befehl für die Abfrage
z.B.

  
SELECT  
    DISTINCT(customer.mail)  
FROM  
    customer  
JOIN  
    groups_customer ON groups_customer.customer_id = customer.id  
WHERE  
    groups_customer.customer_id = 1  
OR  
    groups_customer.customer_id = 2  
OR  
    groups_customer.customer_id = 3  

Wäre es so richtig ?

Danke für Eure Hilfe

EWEN

  1. Hallo,

    Jetzt möchte ich alle kunden zu verschiedener Kundengruppen herausbekommen.

    SELECT
        DISTINCT(customer.mail)

    Nein, du bekommst die unterschiedelichen mail-Adressen heraus. Falls zwei Kunden dieselbe Mail haben, gibt es aber nur eine Antwort.

    Klingt zunächst spitzfindig, ich hatte aber so einen Fall. Ein Mensch mit einer Mail kann sich unter mehreren Veranstaltern anmelden. So wie im normalen Leben ein Mensch Mitglied in mehreren Vereinen sein kann.

    Die Lösung ist nicht die richtige Antwort auf deine Frage. Du suchst DISTINCT(customer.id)

    Kalle - und schnell wegduck

  2. moin,

    meine devise dazu ist immer: "joins sind böse". natürlich sind sie das nicht immer, aber wenn man mit diesem motto die sache angeht, dann hilft das einem ungemein. das problem bei joins ist, dass die anzahl der datensätze sich leicht vervielfachen kann, gerade bei m:n beziehungen. man kann dann zu mitteln wie DISTINCt greifen, ich würde es anders angehen, nämlich mit einer korrelierten unterabfragen.

    SELECT customer.mail
    FROM customer c
    WHERE c.id IN (1,2,3)
    AND EXISTS (SELECT NULL
                FROM groups_customer gc
                WHERE gc.customer_id = c.id
    )
    ;

    Ilja