簡體   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