5

我想加入 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'"

有什么想法让它发挥作用吗?

4

2 回答 2

8

MySQL 有一个内置函数可以帮助处理逗号分隔的列表:

SELECT  . . .
FROM team t INNER JOIN persons p 
  ON FIND_IN_SET(p.email, t.email_list);

但是您不会对性能感到满意,因为它无法优化以使用索引。

另请参阅我对在数据库列中存储逗号分隔列表真的那么糟糕吗?

于 2012-12-10T03:17:03.697 回答
0

我已经将它用于 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+',%';

根据大卫发现更新

于 2012-12-10T03:29:46.943 回答