我有两个表,一个是useremails和instdomains。表结构如下
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 |
这里email 和domainmask 的比较将是'@' 或'.' 之后的数据电子邮件中的符号应与域掩码值进行比较。例如'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, ".", "[.] "), "$")
如果有任何建议,请告诉我
答案 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