从选择MySql查询的列中提取文本

时间:2016-06-01 04:10:13

标签: mysql locate

我有一个名为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列的子字符串,其中包含更多文字
  • 这不是我经常做的事情。我正在研究一个问题,我需要这些行中40-50个链接,我只是希望避免必须从每一行手动拉取链接。
  • 我只能使用MySQL查询浏览器访问此数据库如果我可以连接php,这将是微不足道的
  • 相关网址,其中可包含6-25个参数
  • 相关网址将始终以此参数&sentby=agent
  • 结尾

4 个答案:

答案 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,已发送)的索引。

除此之外,您的方法是有道理的,并且会起作用。你真的尝试过吗?它对你有用吗?