Vinzenz Mai: unkorrekte SQL Abfrage: Newbie sucht Hilfe

Beitrag lesen

Hallo

Zeige mir alle Kunden (Tabelle user), die nichts gekauft haben (Tabelle order) und keinen Newsletter wünschen

d.h. die Kunden, zu denen keine Einträge in order vorhanden sind.
und einen speziellen Eintrag in der Spalte newsletter der Tabelle user haben.

Alle Kundendaten liegen in "user"
Alle Käufe werden in "order" gelistet

Die Kunden ID ist "id" in der user Tabelle, "customer" in der order Tabelle

Meine SQL:

select t1.last_name, t1.first_name, t1.email from user AS t1, order as t2 WHERE t1.id != t2.customer AND t1.newsletter = 0

Nein, auch der von Peter erwähnte Ungleichoperator ist nicht sinnvoll. Das wäre nämlich ein sogenannter Thetajoin., der eben ganz anderes liefert als die von Dir gewünschten Daten. Dein Problem lässt sich z.B. mit einem LEFT JOIN oder einem Subselect (MySQL 4.1 oder neuer) lösen:

SELECT  
    u.last_name,  
    u.first_name,  
    u.email,  
FROM user u  
LEFT JOIN `order` o   -- order ist meiner Meinung nach ein schlechter  
                      -- Spaltenname, da ein [link:http://dev.mysql.com/doc/refman/4.1/en/reserved-words.html@title=reserviertes Wort].  
                      -- Ich persönlich vermeide lieber solche Namen.  
ON u.id = o.customer  
WHERE  
    u.newsletter = 0  -- kein Newsletter  
    AND o.customer [link:http://dev.mysql.com/doc/refman/4.1/en/comparison-operators.html#id3004919@title=IS NULL] -- kein Eintrag in der Tabelle order zu dieser Person  

geht mit jeder mir bekannten MySQL-Version, sogar 3.23. Die Subselect-Variante ist möglicherweise performanter (nutze dazu EXPLAIN):

SELECT  
    u.last_name,  
    u.first_name,  
    u.email,  
FROM user u  
LEFT JOIN `order` o  
ON u.id = o.customer  
WHERE  
    u.newsletter = 0  -- kein Newsletter  
    AND u.id NOT IN (SELECT o2.customer FROM `order` o2)  
        -- kein Eintrag in der Tabelle order zu dieser Person  

geht aber, wie bereits bemerkt, erst ab MySQL 4.1 [1].

Freundliche Grüße

Vinzenz

[1] <gebetsmühle>
        Bei Fragen zu MySQL ist es eine gute Idee, die verwendete Version
        anzugeben, da sich die Fähigkeiten von MySQL zwischen den Versionen
        zum Teil sehr stark unterscheiden.
    </gebetsmühle>