2015-04-02 68 views
0

我有两个表查询。查询两个表,其中一行像另一个

第一表是这样的:

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

但是,这并不工作。

回答

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

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

最后两个选项是最好的,因为他们需要在实数至少有一个下划线。

+0

我们的一个加油站可以使用user_plate另一个plates_user的,但是这需要工作的两种方式。谢谢你;) – Sahee 2015-04-02 10:15:23

+0

@Sahee我明白了。我为你增加了一些其他稍安全的选项。如果他们解决您的问题,请随时接受答案 – 2015-04-02 10:24:18

+0

非常感谢您的帮助。我会尝试你的两个答案备份:) – Sahee 2015-04-02 10:34:43