假设我有一张名为emails
的表格,如下所示:
╔═════════════════════════╦════════════════════════════════════╗
║ subject ║ body ║
╠═════════════════════════╬════════════════════════════════════╣
║ Some Subject ║ Some text .....Client ID: 13456 ║
║ Some Subject ║ Some text .....Client ID: 13457 ║
║ Some Subject ║ Some text .....Client ID: 13458 ║
║ Some Subject ║ Some text .....Client ID: 13459 ║
╚═════════════════════════╩════════════════════════════════════╝
和一个名为clients
的表格如下:
╔═══════════════╦══════════╗
║ client ║ clientID ║
╠═══════════════╬══════════╣
║ Company 1 ║ 13456 ║
║ Company 2 ║ 13457 ║
║ Company 3 ║ 13458 ║
║ Company 4 ║ 13459 ║
╚═══════════════╩══════════╝
我如何加入第一个表的body
列包含第二个表中的clientId
并获得以下结果的两个?:
╔═════════════════════════╦════════════════════════════════════╦══════════╦═════════╗
║ subject ║ body ║client ║clientId ║
╠═════════════════════════╬════════════════════════════════════╬══════════╬═════════╣
║ Some Subject ║ Some text .....Client ID: 13456 ║Company 1 ║13456 ║
║ Some Subject ║ Some text .....Client ID: 13457 ║Company 2 ║13457 ║
║ Some Subject ║ Some text .....Client ID: 13458 ║Company 3 ║13458 ║
║ Some Subject ║ Some text .....Client ID: 13459 ║Company 4 ║13459 ║
╚═════════════════════════╩════════════════════════════════════╩══════════╩═════════╝
我试过了:
select *
from emails e
left join clients c
on e.body like c.clientId
where e.subject = 'Some Subject'
不幸的是,在我中止查询之前运行上述新闻超过5分钟,这似乎表明它不正确或效率极低。
是否可以构建一个可以执行此操作的查询?可能通过使用contains?
全部,感谢您的回答,我要到星期一,并在下次上班时回到此处。
答案 0 :(得分:1)
你可以试一试吗?
select *
from emails e
left join clients c
on e.body regexp concat(': ', c.clientid, '$') = 1
将上述内容与以下内容进行比较:
select *
from emails e
left join clients c on e.body like concat('%: ', c.clientid);
示例:http://sqlfiddle.com/#!9/c2161/5
create table emails (subject varchar(100), body text);
insert into emails values ('test', 'testing: 100'), ('test2', 'testing2: 200');
create table clients (client varchar(100), clientid int);
insert into clients values ('company 1', 100), ('company 2', 200);
结果:
| subject | body | client | clientid |
|---------|---------------|-----------|----------|
| test | testing: 100 | company 1 | 100 |
| test2 | testing2: 200 | company 2 | 200 |
答案 1 :(得分:1)
在'%'
之前和之后连接clientID
。 (如果您确定clientID
将始终是字符串中的最后一个文本,则之后不需要它。)
select *
from emails e
left join clients c
on e.body like CONCAT('%', c.clientId, '%')
where e.subject = 'Some Subject'
答案 2 :(得分:1)
您可以在电子邮件中创建一个新列,该列将从正文字段自动计算clientID。所以当你设置身体时它只会做一次。
试试这个:
ALTER TABLE email
ADD COLUMN clientId INT AS (SUBSTRING_INDEX(body,' ',-1)) PERSISTENT,
ADD KEY (`clientId`) ;
然后您可以使用新字段,并在SELECT中使用索引。
select *
from emails e
left join clients c
on e.clientId like c.clientId
where e.subject = 'Some Subject';
如果它适合您,请告诉我。
答案 3 :(得分:0)
我们可以使用substring_index()函数
从身体获得clientidselect * from emails e
left join clients c
on c.clientid = substring_index(r.body,':', 1)
where e.subject = 'Some Subject'