Как выполнить соединение, используя строку со значением, разделенным запятой?


Я хочу объединить 2 таблицы, в одной из которых есть поле электронной почты, а в другой-разделенный запятыми список электронной почты.

Это сценарий:

Таблицы

Team
--------------
- team_id
- email_list (this is a comma separated email address)


Persons
--------------
 - person_id
 - email

Я попробовал что-то вроде этого:


SELECT team.* FROM team INNER JOIN persons ON trim(persons.email) IN (CONCAT(''',REPLACE(REPLACE(team.email_list,' ',''),',','',''),'''))

Но строка внутри предложения IN выглядит так: "'email1','email2','email3' "

Есть идеи, как заставить его работать?

2 5

2 ответа:

MySQL имеет встроенную функцию, которая может помочь с разделенными запятыми списками:

SELECT  . . .
FROM team t INNER JOIN persons p 
  ON FIND_IN_SET(p.email, t.email_list);
Но вы не будете довольны производительностью, так как она не может быть оптимизирована для использования индекса.

Смотрите также мой ответ на действительно ли хранение списка через запятую в столбце базы данных настолько плохо?

Я использовал это для MSSQL, лично мне это не нравится, но для одного отчета или задач с данными это делает трюк.

declare @team table (team_id int,email_list varchar(8000));
declare @persons table (person_id int,email varchar(64));

insert into @team
SELECT 1,'bob@domain.com,jane@domain.com' union all
SELECT 2,'ben@domain.com,jane@domain.com' union all
SELECT 3,'ben@domain.com,james@domain.com' union all
SELECT 4,'bill@domain.com,alice@domain.com,peter@domain.com' UNION ALL
SELECT 3,'alben@domain.com,james@domain.com' 
;


insert into @persons
select 1,'james@domain.com' union all
select 2,'ben@domain.com' union all
select 3,'alice@domain.com';

select 
  Team.team_id,
  Team.email_list,
  Person.person_id, 
  Person.email 'matched_on'
from
  @team Team
  INNER JOIN @persons Person on ','+Team.email_list+',' LIKE '%,'+Person.email+',%';

Обновлено в соответствии с выводами Дэвида