MySQL: возвращаемое поле, для которого в другой таблице нет связанных записей - PullRequest
2 голосов
/ 17 января 2011

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

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

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

foo.org
example.org

И они получили псевдонимы:

info@foo.org       => admin@foo.org
postmaster@foo.org => user1@foo.org
info@example.org   => admin@example.org

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

Это раскладка таблицы:

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, но безуспешно. Мне не нужно окончательное решение, может быть, просто подсказка с некоторыми объяснениями. Спасибо!

Ответы [ 3 ]

4 голосов
/ 17 января 2011
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 "postmaster@%"
)
2 голосов
/ 17 января 2011
select id,domain from virtual_domains 
where id not in (select domain_id from virtual_aliases)
1 голос
/ 17 января 2011
SELECT * FROM virtual_domains vd
LEFT JOIN virtual_aliases va ON vd.id = va.domain_id
AND va.destination NOT LIKE 'postmaster@%';
...