我有两个表查询。
第一张表看起来像:
| 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`;
但这并不奏效。
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/e899/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
以上所有内容都在您的最小数据集上提供了所需的结果,但我强烈建议您在对实时数据运行这些数据之前先备份数据。
最后两个选项更可取,因为它们需要在realNumber中至少有一个下划线。