【问题标题】:How do I join using a string with a comma separated value?如何使用带有逗号分隔值的字符串加入?
【发布时间】:2012-11-27 11:39:28
【问题描述】:

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

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

【问题讨论】:

    标签: mysql join denormalization


    【解决方案1】:

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

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

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

    另见我对Is storing a comma separated list in a database column really that bad?的回复

    【讨论】:

    • 谢谢!我认为这对性能不利……但我必须暂时这样做……
    【解决方案2】:

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

    根据大卫的调查结果更新

    【讨论】:

    • 这将错误地匹配包含robert@example.com 的列表中的bert@example.com。要修复它,请使用on ',' + Team.email_list + ',' like '%,' + Person.email + ',%'
    猜你喜欢
    • 2015-03-09
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多