繁体   English   中英

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

[英]Extract text from column in select of MySql query

我有一个名为sentEmails的表,其中body列包含电子邮件的正文。

在正文中,有一个子字符串,如:

some link: <a href="https://somelink@somesite.com/somePage.php?someVar=someVal&sentby=agent">Random link text

使用 MySql,我需要从这个列中提取 url,如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:之前some link:
  • 末尾的Random link text会改变
  • 如果必须的话,我可以接受比需要更多的文本,例如,获取https://somelink@somesite.com/somePage.php">Random link text是可以接受的
  • 上面显示的文本是包含更多文本的完整body列的子字符串
  • 这不是我会经常做的事情。 我正在研究一个问题,我需要这些行中 40-50 行的链接,我只是希望避免必须从每一行手动拉出链接。
  • 如果我可以与 php 连接,我只能使用 MySQL 查询浏览器来访问这个数据库,这将是微不足道的
  • 有问题的 url,可以有 6-25 个参数
  • 有问题的 url 将始终以此参数结尾&sentby=agent

如果 URL 周围有两个唯一的分隔符,则可以使用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列中的任何位置,并且body只有一个 HTML 标记,那么这应该可以工作。

如果body列只是一大块 HTML,那么您应该考虑使用 xpath 并在您的应用程序层中处理它。

如果你只是想把链接提取出来,你能做 instr() 和 mid 函数吗? 像这样的东西

select mid(body,substr(body,'="'),substr(body,'">')-substr(body,'="')) from email...

substr(body,'="') = 链接的起始位置 =" 和 substr(body,'">') 是链接的结束位置。

MID 函数采用 (str,pos, len) 和 len = 结束位置 - 起始位置

感谢蒂姆的帮助,我能够使用以下查询来解决这个问题:

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'

做这种搜索并不方便。 随着包含电子邮件的表越来越大,查询的性能会越来越低。

如果这是您正在构建的新应用程序,最好保留一个单独的表,其中包含在每封发送的电子邮件中使用的 URL 列表。 您可以在发送电子邮件时将 URL 写入数据库。

这样做的原因是该应用程序将在数据库中进行比发送电子邮件更多的搜索。 因此,通过在发送电子邮件时做一些额外的工作,您可以在该功能最昂贵的用途(即搜索)方面提供很多帮助。

如果您仍然决定保留当前的方法,您将需要一个包含按此顺序排列的列(toEmail、sent)的索引。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM