我有一个名为sentEmails
的表,其中body
列包含电子邮件的正文。
在正文中,有一个子字符串,如:
some link: <a href="https://somelink@somesite.com/somePage.php?someVar=someVal&sentby=agent">Random link text
使用MySql,我需要从https://somelink@somesite.com/somePage.php?someVar=someVal&sentby=agent
我在想通过找到起始位置并返回接下来的150个字符来完成下面的工作,当然它实际上只返回前150个字符。
SELECT LEFT(body, LOCATE('some link: <a href="', body)+150) AS link
FROM sentEmails
WHERE sent between date_sub(now(),INTERVAL 1 WEEK) and now()
AND body like '%some link:%'
AND toEmail = 'email@gmail.com'
其他信息:
some link:
Random link text
最后会更改https://somelink@somesite.com/somePage.php">Random link text
可以接受body
列的子字符串,其中包含更多文字&sentby=agent
答案 0 :(得分:0)
如果您在网址周围有两个唯一的分隔符,那么可以使用SUBSTRING()
来隔离它。一种方法是使用分隔符替换锚标记中URL的两侧:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(
REPLACE(REPLACE(body, '<a href="', '~'), '&sentby=agent">', '&sentby=agent~'), '~', -2),
'~', 1)
FROM sentEmails
WHERE sent BETWEEN DATE_SUB(NOW(), INTERVAL 1 WEEK) AND NOW() AND
body LIKE '%some link:%' AND
toEmail = 'email@gmail.com'
我将<a href="
和">
替换为~
。如果~
列中的任何位置都没有body
,并且您的正文中只有一个HTML标记,那么这应该有用。
如果body
列只是HTML的一大块,那么您应该考虑使用xpath并在应用层中处理它。
答案 1 :(得分:0)
如果您只是尝试提取链接,可以执行instr()和mid函数。像这样的东西
select mid(body,substr(body,'="'),substr(body,'">')-substr(body,'="')) from email...
substr(body,&#39; =&#34;&#39;)=链接的起始位置=&#34;和substr(正文,&#39;&#34;&gt;&#39;)是链接的结束位置。
MID函数接受(str,pos,len)和len =结束位置 - 起始位置
答案 2 :(得分:0)
感谢Tim的帮助,我能够使用以下查询:
SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(body, 'some link: <a href="', -1) , 'sentby=agent">', 1) AS link
FROM sentEmails
where sent between date_sub(now(),INTERVAL 1 WEEK) and now()
AND body like '%some link:%'
AND toEmail = 'email@gmail.com'
答案 3 :(得分:-2)
进行这种搜索并不方便。随着电子邮件表的大小增加,查询的性能将越来越低。
如果这是您正在构建的新应用程序,那么您可以更好地保留一个单独的表格,其中包含每个已发送电子邮件中使用的URL列表。您在发送电子邮件时将URL写入数据库。
这样做的原因是应用程序将在数据库中执行更多搜索而不是发送电子邮件。因此,通过在发送电子邮件时做一些额外的工作,您可以在最昂贵的功能使用方面提供帮助,这就是搜索。
如果您仍然决定保留当前的方法,那么您将希望拥有一个包含此顺序列(toEmail,已发送)的索引。
除此之外,您的方法是有道理的,并且会起作用。你真的尝试过吗?它对你有用吗?