2013-02-17 63 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

相关问题