2016-02-17 78 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因为你必须检查所有时间。