MySQL SELECT строк, которые частично совпадают со строкой из другой таблицы - PullRequest
1 голос
/ 08 мая 2011

У меня есть две таблицы: одна с электронными письмами, а другая с доменами.

Table1                  Table2
id email                id  domain
-- ----                 --  ----
1  name@domain1.com     1   domain1.com
2  name@domain2.com     2   domain4.com
3  name@domain3.com
4  name@domain4.com

Теперь я хочу выбрать все электронные письма из таблицы 1, где домен соответствует полю домена в таблице 2. Результат должен быть таким:сочетание REGEXP и INNER JOIN?Но я не знаю, как их объединить.

Ответы [ 3 ]

4 голосов
/ 08 мая 2011

Я создал для таблиц и сделал тест, и этот запрос работал для меня:

SELECT t1.*, t2.domain FROM t1
INNER JOIN t2 ON t1.email LIKE CONCAT('%@', t2.domain);
3 голосов
/ 08 мая 2011

Раствор 1:

Использование Table1.email LIKE CONCAT('%@',Table2.domain).

БОЛЬШОЙ ЖИР КРАСНЫЙ ПРЕДУПРЕЖДЕНИЕ: это условие не индексируется. Если вам нужна скорость, разделите электронную почту на адрес и домен в таблице 1 и создайте индекс.

РЕДАКТИРОВАТЬ:

На самом деле это условие JOIN потребует сравнений count (email) xcount (domain), поэтому это, вероятно, самый медленный способ.

Решение 2:

У Роба есть очень хорошая мысль: более быстрый способ - извлечь домен из электронного письма (используя подстроку) и сопоставить его с индексом в таблице доменов

Раствор 3:

Лучший способ - проиндексировать домен электронной почты. В Postgres вы должны создать индекс функции ON extract_domain (электронная почта) (предположим, что вы создаете тривиальную функцию extract_domain ()), но вы не можете сделать это в MySQL, поэтому дополнительный столбец с доменом - это путь к скорости.

Если вы хотите знать все электронные письма в ОДНОМ домене,

Solution 1 : seq scan table emails + fast LIKE
Solution 2 : seq scan table emails + slightly slower domain extraction
Solution 3 : index scan table emails

Если вы хотите присоединиться к таблицам доменов для всех доменов / всех электронных писем:

Solution 1 : count(email)xcount(domain) comparisons, very slow
Solution 2 : seq scan table emails + index scan domains
Solution 3 : nested loop index join

Для полного JOIN было бы еще быстрее использовать соединение слиянием или хэш-соединение, но это не предоставляется mysql.

2 голосов
/ 08 мая 2011

Попробуйте это

SELECT t1.Id, 
       t1.Email
  FROM Table1 t1
  JOIN Table2 t2 ON t1.email LIKE CONCAT('%@', t2.Domain);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...