2013-02-17 76 views
0

這是我第一次在這裏發佈!希望能得到很好的答覆。在另一列找到一列的詞並替換?

我有兩個表,並根據路徑我需要找到並替換'table1名稱table2的名稱。

table1 
+---------------+----------+ 
| name   | path  | 
+---------------+----------+ 
| John Smith | 12345 | 
+---------------+----------+ 
| John Smith | 54321 | 
+---------------+----------+ 
| JohnSmith  | 12345 | 
+---------------+----------+ 

table2 
+---------------+----------+ 
| name   | path  | 
+---------------+----------+ 
| John   | 12345 | 
+---------------+----------+ 
| Smith   | 54321 | 
+---------------+----------+ 

the final result would be like 
+---------------+----------+ 
| name   | path  | 
+---------------+----------+ 
| Smith   | 12345 | 
+---------------+----------+ 
| John   | 54321 | 
+---------------+----------+ 
| JohnSmith  | 12345 | 
+---------------+----------+ 

正如你所看到的,我只需要替換完全匹配。所以在約翰史密斯我不會刪除約翰。

問題是,我只做一個MySQL查詢嗎?或者一些PHP也需要這樣的東西?

預先感謝您。


這兩個查詢都接近,但沒有給出我需要的輸出。

例如第一個產生

NAME  PATH 
Smith  12345 
John  54321 
Smith  12345 

這裏最後一行,不應該改變。由於我們沒有任何完全匹配。並且該行應保持不變「JohnSmith對」

在第二個,輸出

NAME  PATH 
Smith  12345 
John Smith 54321 
JohnSmith 12345 

這裏的第二個行似乎是錯誤的,因爲它應該刪除「史密斯」

什麼想法?

+0

http://stackoverflow.com/q/986826/1291428 – Sebas 2013-02-17 14:53:34

回答

0

這很接近,但我承認不瞭解你最後的情況 - 不應該是史密斯/ 12345嗎?它使用REPLACE

SELECT REPLACE(t1.Name, t2.Name, '') Name, t1.Path 
FROM Table1 t1 
    LEFT JOIN Table2 t2 ON t1.path = t2.path 

這裏是SQL Fiddle

- 編輯 -

下面是一個使用CASE語句的嘗試。它檢查中間,在開始的時候,或者在最後:

SELECT 
    CASE 
    WHEN t1.Name Like CONCAT('% ',IFNULL(t2.Name,''),' %') 
    THEN REPLACE(t1.Name, CONCAT(' ',IFNULL(t2.Name,''),' '), ' ') 

    WHEN t1.Name Like CONCAT(IFNULL(t2.Name,''),' %') 
    THEN REPLACE(t1.Name, CONCAT(IFNULL(t2.Name,''),' '), '') 

    WHEN t1.Name Like CONCAT('% ',IFNULL(t2.Name,'')) 
    THEN REPLACE(t1.Name, CONCAT(' ',IFNULL(t2.Name,''),' '), '') 

    ELSE 
     t1.Name 

END Name, t1.Path 
FROM Table1 t1 
    LEFT JOIN Table2 t2 ON t1.path = t2.path 

而且更Fiddle

產生如下的結果:

NAME  PATH 
Smith  12345 
John Smith 54321 
JohnSmith 12345 
+0

我把我的答覆作爲答案..對不起,這兩個查詢都很接近......但並不完全是我需要的輸出... – user2080591 2013-02-18 07:44:03

+0

@ user2080591 - 在那裏沒有被刪除的額外空間 - 在這裏你去:http: //www.sqlfiddle.com/#!2/c6cba0/17 – sgeddes 2013-02-18 12:33:11

+0

這是一個問題。在table2中,我可能有許多具有相同路徑的行。它們不是重複的,因爲它們是不同的拼寫變體。我如何改變查詢,而不是選擇,但更新,而不是顯示重複,因爲現在與表2中的選擇和多行左連接顯示10倍相同的行... 或者,如何使用CASE查詢在table1中執行更新? 謝謝 – user2080591 2013-02-19 07:33:16

0

這將做的工作:

SELECT 
    REPLACE(CONCAT(' ',t1.Name,' '), 
    CONCAT(' ',t2.Name,' '), '') Name, 
    t1.Path 
FROM 
    Table1 t1 
LEFT JOIN 
    Table2 t2 ON t1.path = t2.path 
+0

這裏是一個問題。在table2中,我可能有許多具有相同路徑的行。它們不是重複的,因爲它們是不同的拼寫變體。我如何改變查詢,而不是選擇,但更新,而不是顯示重複,因爲現在與table2中的選擇和多行左連接顯示10倍同一行...謝謝 – user2080591 2013-02-19 07:28:55

相關問題