2011-01-17 1 views
2

Во-первых, извините за заголовок, поскольку я не являюсь родным англо-говорящим, это довольно сложно выразить. Другими словами, то, что я пытаюсь достичь этого:MySQL: поле возврата, для которого нет связанных записей в другой таблице

  • Я пытаюсь извлечь все доменные имена из таблицы virtual_domains, где нет соответствующей записи в таблице virtual_aliases начиная, как «смотритель @%» ,

Так что, если у меня есть два домена:

foo.org 
example.org 

An они получили псевдонимами, как:

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

Я хочу, чтобы запрос, чтобы вернуться только домен "foo.org" в качестве «примера .org "отсутствует псевдоним postmaster.

Это сервировка:

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 |    | 
+-------+-------------+------+-----+---------+----------------+ 

Я пытался в течение многих часов с IF, CASE, LIKE запросов с не увенчались успехом. Мне не нужно окончательное решение, может быть, просто намек с некоторым объяснением. Благодаря!

ответ

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 возвращает все записи из «левой» таблицы, даже если они не имеют соответствующих записей в таблице «правильной». Эти записи будут иметь правильные поля таблицы, установленные в NULL. Используйте ГДЕ, чтобы удалить все остальные.


Я предполагаю, что я не понял вас правильно в первый раз. У вас есть несколько записей в aliases для одного домена, и вы хотите отображать только те домены, у которых нет записи в таблице псевдонимов, которая начинается с «postmaster»?

В этом случае вы должны использовать NOT IN так:

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

что-то не хватает? – ajreal

+0

Это прекрасно работает. Не знал, что это будет «легко» реализовать. – weeheavy

+0

Увы, я был слишком быстр: этот запрос не удастся, если существует какой-либо случайный псевдоним (я хочу найти домены, отсутствующие точно в псевдонимах «postmaster @», но все равно спасибо! – weeheavy

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

Это не проверка на "почтмейстер @%" –

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

Спасибо, но это возвращает все, что не соответствует «postmaster @%». Я хотел бы иметь список доменов, у которых отсутствует «postmaster @» - псевдоним (и только точно этот псевдоним). – weeheavy

Смежные вопросы