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

时间:2015-04-02 10:05:59

标签: mysql join sql-like

我有两个表查询。

第一个表格如下:

| 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        |

在第一张表中有车牌,第二张表有plates_username。我需要连接它们并更新第一个表以匹配。

我试图这样做:

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

但这不起作用。

1 个答案:

答案 0 :(得分:0)

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

小提琴: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

小提琴:http://sqlfiddle.com/#!9/c5bc7/1

以上所有内容都会在您的最小数据集上提供所需的结果,但强烈建议您在对实时数据运行任何这些数据之前备份数据。

最后两个选项更可取,因为它们在realNumber中至少需要一个下划线。