查询两个表,其中一行与另一行相似
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
以上所有内容都在您的最小数据集上给出了预期的结果,但我强烈建议您在 运行 对您的实时数据进行任何这些操作之前先备份您的数据。
最后两个选项更可取,因为它们要求实数中至少有一个下划线。
我有两个 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
以上所有内容都在您的最小数据集上给出了预期的结果,但我强烈建议您在 运行 对您的实时数据进行任何这些操作之前先备份您的数据。
最后两个选项更可取,因为它们要求实数中至少有一个下划线。