Как выполнить соединение, используя строку со значением, разделенным запятой?
Я хочу объединить 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 ответа:
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+',%';
Обновлено в соответствии с выводами Дэвида