2016-02-17 77 views
1

我有一個名爲flights表,其中reservationNum列是每個航班預訂確認號碼(8位數字)如何在MySQL中的REGEX匹配上連接兩個表?

我有一個名爲sentEmails表,其中body列已發送的電子郵件的正文。電子郵件預訂的8位確認號碼存儲在body列中的文本中。

我需要從sentEmails拉的所有行主題包含Some text,但我還需要其他的一些信息是與預訂

我想我也許可以在連接表相關的flights錶行中正則表達式匹配像下面:

Select * 
from sentEmails se 
join flights f on f.reservationNum = se.body REGEXP '\d{8}' 
where subject like '%Some text%' 
and sentDate > '2016-02-01' 

第一行該似乎工作的兩個表中給出的信息。不幸的是,從flights數據是不正確的,並且第一行後,所有剩餘的行具有相同的sentEmails數據和沒有數據爲flights

是否有可能加入對正則表達式匹配兩個表中的MySQL?如果沒有,我如何檢索所需的數據?

注意鑑於該電子郵件的標準化內容,我可以100%肯定的是,只有8位數字各包含的是一個我需要

+1

最好是創建一個包含您需要加入的信息的臨時表。這個正則表達式會表現得很糟糕。 –

+0

這樣做是個壞主意。因爲您沒有100%保證,電子郵件中的8位數字是確認號碼。 – SiZE

+0

@RobertHarvey這是一個完全公平的點,你能告訴我該怎麼做?我無法弄清楚如何真正從電子郵件中確認確認號碼,所以我可以使用它,這是2張表共用的唯一東西 – DelightedD0D

回答

0
SELECT * FROM flights WHERE reservationNum=(
    SELECT 
     SUBSTRING(body, pos-7, 8) 
    FROM (
     SELECT 
      GREATEST(
       LOCATE('0', body), 
       LOCATE('1', body), 
       LOCATE('2', body), 
       LOCATE('3', body), 
       LOCATE('4', body), 
       LOCATE('5', body), 
       LOCATE('6', body), 
       LOCATE('7', body), 
       LOCATE('8', body), 
       LOCATE('9', body) 
      ) as pos, 
      body 
     FROM 
      sentEmails 
    ) q 
) 

如果你知道位置,你可以manualy設置或者您可以使用UDF像這樣的https://github.com/hholzgra/mysql-udf-regexp

修訂

SELECT * FROM flights f 
INNER JOIN (
    SELECT 
     SUBSTRING(body, pos-7, 8) sub 
    FROM (
     SELECT 
      GREATEST(
       LOCATE('0', body), 
       LOCATE('1', body), 
       LOCATE('2', body), 
       LOCATE('3', body), 
       LOCATE('4', body), 
       LOCATE('5', body), 
       LOCATE('6', body), 
       LOCATE('7', body), 
       LOCATE('8', body), 
       LOCATE('9', body) 
      ) as pos, 
      body 
     FROM 
      sentEmails 
    ) q1 
) q2 ON (q2.sub=f.reservationNum) 
+0

這看起來應該工作,但是當我運行它時,我得到了'錯誤代碼:1242.子查詢返回多於1行' – DelightedD0D

+0

我改變了'我有第一次嘗試相同的問題,第一行返回錯誤的數據,其他所有的都是空白的 – DelightedD0D

+0

@ DelightedD0D我已經更新了我的答案 – SiZE

0

經典問題 - 在將數據插入數據庫之前,您需要清除數據。也就是說,當你得到body時,發現'數字'並提取它。然後用數字標記記錄。這可能涉及與標籤(航班號)和記錄的IDS他們在發現了另一個表。

即使你可以編造一個RegExp,這將是slooow因爲你必須檢查所有時間。