Выбрать без дубликатов из определенной строки/ключа

Благодаря @Ed Gibbs мне удалось решить мою первую проблему в этом случае (Выбрать дубликат и оставить самый старый (не на основе идентификатора))

Теперь я столкнулся с новой проблемой, которую не могу решить.

У меня есть две таблицы: «домен», в котором нет дубликатов, и «электронная почта», содержащая дубликаты. В первой таблице у меня было значение под названием «дата создания», которое я использовал в качестве фильтра. Во второй таблице у меня нет фильтра, но некоторая информация может (я думаю) использоваться в качестве фильтра.

Домен таблицы:

| domain     | value 1 | foreign_key |
|------------|---------|-------------|
| google.com | patrick | X           |
| yahoo.com  | britney | Y           |
| ebay.com   | harry   | Z           |

Электронная почта таблицы:

| email              | value 1 | foreign_key |
|--------------------|---------|-------------|
| [email protected]    | patrick | X           |
| [email protected]    | britney | Y           |
| [email protected]   | mary    | X           |
| [email protected] | jack    | X           |
| [email protected]     | walter  | Z           |
| [email protected]    | brian   | Y           |

Как видно из первой таблицы, домен google.com обрабатывается X Foreign_key. В таблице адресов электронной почты записи "[email protected],patrick,X" и "[email protected],mary,X" в порядке, поскольку они соответствуют правильному иностранному ключу. Проблема заключается в таких записях, как «[email protected],britney,Y», Y не является связанным Foreign_key с доменом google.com, поэтому я хочу его удалить.

Вот искомая таблица:

| email              | value 1 | foreign_key |
|--------------------|---------|-------------|
| [email protected]    | patrick | X           |
| [email protected]   | mary    | X           |
| [email protected] | jack    | X           |
| [email protected]     | walter  | Z           |
| [email protected]    | brian   | Y           |

Как я могу выбрать эти данные без ошибочных записей? Я думаю, что ключом проблемы является concat/substring, но я не могу понять, как это сделать.

Спасибо за вашу помощь.


person Arka    schedule 28.05.2013    source источник
comment
Является ли различие между yahoo.fr и yahoo.com преднамеренным или просто опечаткой?   -  person piotrm    schedule 29.05.2013
comment
Вы правы, моя ошибка — это yahoo.com.   -  person Arka    schedule 29.05.2013


Ответы (1)


Чтобы получить домен из правильного адреса электронной почты, вы можете использовать substring_index() и использовать простое соединение, основанное на совпадении внешнего ключа и домена.

SELECT email.* FROM email 
JOIN domain ON email.foreign_key = domain.foreign_key
               AND substring_index( email.email, '@', -1 ) = domain.domain
person piotrm    schedule 28.05.2013
comment
Спасибо, завтра попробую. Не могли бы вы объяснить мне, что означает -1 в substring_index? - person Arka; 29.05.2013
comment
Это означает получить все, что есть, после первого «@», а не до. Я считаю, что руководство по ссылке ясно об этом. - person piotrm; 29.05.2013