mysql - 如何在 MySQL 中通过 REGEX 匹配连接两个表?

标签 mysql regex join

我有一个名为 flights 的表,其中 reservationNum 列是每个航类预订的确认编号(8 位数字)

我有一个名为 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 中通过 REGEX 匹配连接两个表?如果没有,我该如何检索所需的数据?

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

最佳答案

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)

关于mysql - 如何在 MySQL 中通过 REGEX 匹配连接两个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447797/

相关文章:

一个可能被引号包围的单词的 C# 正则表达式

regex - 如何使用 perl 正则表达式查找不包含冒号符号的文本行

MySQL 合并具有相同 ID 的行,同时保留时间戳

mysql - oracle查询从表中获取最后4条记录

Mysql临时表语法

mysql - 将日期保存到 MySql 时 SQL 语法错误

php - 最快与最好 ​​- 唯一索引或检查是否存在

php - preg_match 或运算符

mysql - 无法通过计算相关表中的字段来更新表

mysql - HABTM特殊加盟