需要帮助编写查询以映射值

时间:2021-05-26 04:21:44

标签: mysql sql

我有两个表,一个是useremailsinstdomains。表结构如下

CREATE TABLE instdomains (
  DomainID int(11) NOT NULL AUTO_INCREMENT,
  DomainMask varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  InstitutionID int(11) NOT NULL,
  shareddomain tinyint(1) DEFAULT '0',
  masterdomainid int(6) DEFAULT NULL,
  PRIMARY KEY (DomainID)
);

CREATE TABLE useremails (
 EmailID int(11) NOT NULL AUTO_INCREMENT,
  UserID int(11) NOT NULL,
  email varchar(200) NOT NULL,
  Verified tinyint(1) DEFAULT NULL,
  PRIMARY KEY (EmailID),
);

在这里,我想通过比较 domainmask 将新列 InstitutionID 添加到 useremails 表,该列应该与 instdomains 表映射> 值和 email 值来自 usermails 表。

instdomains表数据如下

<头>
INSTDOMAINS
域ID 域掩码 机构 ID 共享域 masterdomainid
1 harvard.edu 2 0 0
2 princeton.edu 19 0 0
3 brown.edu 196 0 0
4 bu.edu 217 0 0
5 wustl.edu 287 0 0
6 mcmaster.ca 326 0 0

用户邮件表数据如下

<头>
用户邮箱
电子邮件 ID 用户 ID 电子邮件 已验证
1 15 antonio_gomes@hms.harvard.edu 1
2 19 lcwong@princeton.edu 1
3 56 jason_ziplow@Brown.edu 1
4 33 clsmith@bu.edu 1
5 45 menneris@wustl.edu 1
6 65 peiy@univmail.cis.mcmaster.ca 1

因此这里将useremails表中email列中的数据与instdomains表的domainmask列进行比较,然后它应该通过与 instdomain 表相对于 domainmask 值的 comarimg 更新 usermails 表上的 institutionid。示例输出如下

<头>
样本输出
电子邮件 ID 用户 ID 电子邮件 已验证 机构 ID
1 15 antonio_gomes@hms.harvard.edu 1 2
2 19 lcwong@princeton.edu 1 19
3 56 jason_ziplow@Brown.edu 1 196
4 33 clsmith@bu.edu 1 217
5 45 menneris@wustl.edu 1 287
6 65 peiy@univmail.cis.mcmaster.ca 1 326

这里emaildomainmask 的比较将是'@''.' 之后的数据电子邮件中的符号应与域掩码值进行比较。例如'a@test.com'应与'test.com'匹配 或者如果 'example.test.com' 存在,它会与之匹配。

例如'abc@utest.com'不应映射到'test.com',因为我们在之后有u @ 符号

我使用了以下概念

substr(u.email, locate("@", u.email) +1) regexp concat("(^|[.])", replace(DomainMask, ".", "[.] "), "$")

如果有任何建议,请告诉我

1 个答案:

答案 0 :(得分:1)

对于问题中所需的输出:

SELECT useremails.*, instdomains.InstitutionID
FROM useremails
JOIN instdomains ON useremails.email LIKE CONCAT('%', instdomains.DomainMask);

或者,对于评论“它如何仅在 '@'、'.' 之后进行比较?”

SELECT useremails.*, instdomains.InstitutionID
FROM useremails
JOIN instdomains ON instdomains.DomainMask = SUBSTRING_INDEX(useremails.email, '@', -1);

还有一种变体 - instdomains 域中来自 email 的域必须仅以 .@ 开头:

SELECT useremails.*, instdomains.InstitutionID
FROM useremails
JOIN instdomains ON useremails.email REGEXP CONCAT('^.*[.@]', instdomains.DomainMask, '$');

并创建/填充引用列:

ALTER TABLE instdomains
ADD INDEX (InstitutionID);

ALTER TABLE useremails
ADD COLUMN InstitutionID INT;

UPDATE useremails
JOIN instdomains ON useremails.email REGEXP CONCAT('^.*[.@]', instdomains.DomainMask, '$')
SET useremails.InstitutionID = instdomains.InstitutionID;

ALTER TABLE useremails
ADD CONSTRAINT fk_InstitutionID FOREIGN KEY (InstitutionID) REFERENCES instdomains (InstitutionID);

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=dbc18a6cc580b85a3b507fb01c81ed09