![](/img/trans.png)
[英]how to select a part of a text column as new column in mysql query
[英]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
列的子字符串&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.