我可以在mySQL中加入Contains等吗?

时间:2015-12-19 05:53:24

标签: mysql

假设我有一张名为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?

全部,感谢您的回答,我要到星期一,并在下次上班时回到此处。

4 个答案:

答案 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()函数

从身体获得clientid
select * from emails e 
left join clients c 
on c.clientid = substring_index(r.body,':', 1) 
where e.subject = 'Some Subject'