查询两个表,其中一行与另一行相似

Query two tables where one row is like another

我有两个 table 查询。

第一个 table 看起来像:

| id     | Number      |
+--------+-------------+
| 1      | WDX         |
| 2      | ABd32       |
| 3      | CACY        |

第二个赞:

| id     | realNumber  |
+--------+-------------+
| 1      | w_WDX_zed   |
| 2      | ABd32_ala   |
| 3      | guava       |

输出需要如下所示:

| id     | output      |
+--------+-------------+
| 1      | w_WDX_zed   |
| 2      | ABd32_ala   |
| 3      | CACY        |

第一个table是车牌,第二个是plates_username。我需要先连接它们并更新 table 以匹配。

我试着这样做:

UPDATE `TAB_a` a, `TAB_b` b 
    SET a.`Number` = b.`realNumber`
    WHERE a.`Number` LIKE CONCAT('%',b.`realNumber`,'%') AND a.Number <> b.`realNumber`;

但这不起作用。

update plates p 
  inner join plate_users pu
    on pu.realNumber like concat(concat('%', p.number), '%')
  set p.number = pu.number

然而,这充满了危险——如果有一些板是另一个板的子串,您可能会得到不需要的结果。

如果 realNumber 应该是 ,为什么第一个是 _?如果那些类型不在那里,它会更容易和更安全。

编辑

好的,在了解了下面的更多信息后,您可以尝试另外两个选项:

update plates p 
  inner join plate_users pu
    on pu.number like concat('%\_', p.number)
      or pu.number like concat(p.number, '\_%')
      or pu.number like concat(concat('%\_', p.number), '\_%')
  set p.number = pu.number

Fiddle: http://sqlfiddle.com/#!9/e8999/1

update plates p 
  inner join plate_users pu
    on pu.number REGEXP concat(concat('.*_?', p.number), '_?.*')
  set p.number = pu.number

Fiddle: http://sqlfiddle.com/#!9/c5bc7/1

以上所有内容都在您的最小数据集上给出了预期的结果,但我强烈建议您在 运行 对您的实时数据进行任何这些操作之前先备份您的数据。

最后两个选项更可取,因为它们要求实数中至少有一个下划线。