我有一个名为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位数字是我需要的数字
答案 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,它也会是懒散的,因为你必须每次检查所有行。