【问题标题】:How can I join two tables on a REGEX match in MySQL?如何在 MySQL 的 REGEX 匹配中加入两个表?
【发布时间】:2016-05-28 15:09:33
【问题描述】:

我有一张名为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 位数字是我需要的数字

【问题讨论】:

  • 最好创建一个包含您需要加入的信息的临时表。那个正则表达式的表现会很糟糕。
  • 这样做是个坏主意。因为您没有 100% 保证电子邮件中的 8 位数字是确认号。
  • @RobertHarvey 说的很对,你能告诉我怎么做吗?我不知道如何从电子邮件中实际获取确认号,以便我可以使用它,这是 2 个表的唯一共同点
  • @SiZE 鉴于电子邮件中的标准化内容,我可以 100% 确定它包含的唯一 8 位数字就是我需要的数字
  • 告诉他们用正则表达式半途而废要花多少钱(价值数千美元),也许他们会加快您的请求。

标签: mysql regex join


【解决方案1】:
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)

【讨论】:

  • 这看起来应该可以工作,但是当我运行它时,我得到Error Code: 1242. Subquery returns more than 1 row
  • 我将reservationNum= 更改为reservationNum IN,但我遇到了与第一次尝试相同的问题,第一行返回错误数据,其他所有数据均为空白
  • 和以前一样,第一行返回错误数据,其他都是空白,我晚上回家了,但我明天再看一遍。感谢您的帮助!
  • @DelightedD0D 运行子查询得到sub 它返回什么?
【解决方案2】:

经典问题——您需要在将数据插入数据库之前清理数据。也就是说,发现“数字”并在您获得body 时提取它。然后用数字标记记录。这可能涉及另一个带有标签(航班号)和它们所在记录的 ID 的表。

即使你可以编造一个 REGEXP,它也会很慢,因为你必须检查所有每次

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多