2011-01-17 3 views
2

Zuerst, sorry für den Titel, da ich kein englischer Muttersprachler bin, ist das ziemlich schwer zu formulieren. Mit anderen Worten ist es das, was ich versuche zu erreichen:MySQL: Rückgabefeld, für das in einer anderen Tabelle keine Einträge vorhanden sind

  • Ich versuche, allen Domain-Namen aus der Tabelle virtual_domains zu holen, wo es in der virtual_aliases Tabelle beginnen wie „postmaster @%“ kein entsprechender Eintrag ist .

Also, wenn ich zwei Domains:

foo.org 
example.org 

An sie haben Aliase wie:

[email protected]  => [email protected] 
[email protected] => [email protected] 
[email protected] => [email protected] 

Ich möchte die Abfrage nur die Domain "foo.org" als „Beispiel zurückzukehren .org "fehlt der Postmaster-Alias.

Dies ist das Tabellenlayout:

mysql> show columns from virtual_aliases; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| domain_id | int(11)  | NO | MUL | NULL |    | 
| source  | varchar(100) | NO |  | NULL |    | 
| destination | varchar(100) | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

mysql> show columns from virtual_domains; 
+-------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+-------+-------------+------+-----+---------+----------------+ 
| id | int(11)  | NO | PRI | NULL | auto_increment | 
| name | varchar(50) | NO |  | NULL |    | 
+-------+-------------+------+-----+---------+----------------+ 

ich viele Stunden lang versucht, mit IF, CASE, LIKE Abfragen ohne Erfolg. Ich brauche keine endgültige Lösung, vielleicht nur einen Hinweis mit einer Erklärung. Vielen Dank!

Antwort

4
SELECT * FROM virtual_domains AS domains 
LEFT JOIN virtual_aliases AS aliases 
ON domains.id = aliases.domain_id 
WHERE aliases.domain_id IS NULL 

LEFT JOIN alle Datensätze kehrt von der "linken" Tisch, auch sie in "richtigen" Tabelle keine entsprechenden Datensätze haben. Für diese Datensätze werden die richtigen Tabellenfelder auf NULL gesetzt. Verwende WHERE, um alle anderen zu entfernen.


Ich denke, ich habe dich nicht das erste Mal richtig verstanden. Sie haben mehrere Einträge in aliases für einzelne Domäne, und Sie möchten nur diejenigen Domänen anzeigen, die keinen Eintrag in Aliase-Tabelle haben, die mit "postmaster" beginnt?

In diesem Fall Sie NOT IN wie diese sind verwenden sollten:

SELECT * FROM virtual_domains AS domains 
WHERE domains.id NOT IN (
    SELECT domain_id 
    FROM virtual_aliases 
    WHERE whatever_column LIKE "[email protected]%" 
) 
+0

etwas fehlt? – ajreal

+0

Das funktioniert perfekt. Wusste nicht, dass das "einfach" zu implementieren wäre. – weeheavy

+0

Whoops, ich war zu schnell: Diese Abfrage wird fehlschlagen, wenn ein zufälliger Alias ​​existiert (Ich möchte Domains finden, die genau "postmaster @" Aliasnamen vermissen. Aber trotzdem danke! – weeheavy

2
select id,domain from virtual_domains 
where id not in (select domain_id from virtual_aliases) 
+0

Es Überprüfung ist nicht für die "postmaster @%" –

1
SELECT * FROM virtual_domains vd 
LEFT JOIN virtual_aliases va ON vd.id = va.domain_id 
AND va.destination NOT LIKE '[email protected]%'; 
+0

Danke, aber das liefert alles zurück, was nicht mit "postmaster @%" übereinstimmt. Ich hätte gerne eine Liste von Domains, die keinen "postmaster @" - Alias ​​haben (und nur genau dieser Alias). – weeheavy

Verwandte Themen