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" gelistetDie 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>