我有一个名为 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/