2015-04-02 49 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

相關問題