如何在MySQL中的REGEX匹配上连接两个表?

时间:2016-02-17 04:12:15

标签: mysql regex join

我有一个名为flights的表格,reservationNum列是每个航班预订的确认号码(8位数字)

我有一个名为sentEmails的表,其中body列是发送的电子邮件的正文。电子邮件所用预订的8位数确认号位于body列中的文本中。

我需要从主题包含sentEmails的{​​{1}}中提取所有行,但我还需要与该预订关联的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列的数据

是否可以在MySQL中的REGEX匹配上连接两个表?如果没有,我该如何检索所需数据?

注意鉴于电子邮件中的标准化内容,我可以100%确定每个包含的唯一8位数字是我需要的数字

2 个答案:

答案 0 :(得分: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
)

如果您知道位置,您可以手动设置它,或者您可以像这样使用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)

答案 1 :(得分:0)

经典问题 - 在将数据插入数据库之前,您需要清理数据。也就是说,发现号码'当你得到body时提取它。然后使用数字标记记录。这可能涉及另一个带有标签(航班号)的表和他们在其中找到的记录的ID。

即使你可以编写一个REGEXP,它也会是懒散的,因为你必须每次检查所有