在另一列中查找列的单词并替换?

时间:2013-02-17 14:50:59

标签: mysql

这是我第一次在这里发帖!希望得到一个好的回复。

我有两个表,根据我需要找到的路径,并用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?

提前谢谢。


两个查询都很接近,但没有完全给出我需要的输出。

e.g。第一个产生

NAME        PATH
Smith       12345
John        54321
Smith       12345

这里最后一行,不应该是变化。因为我们没有任何完全匹配。这行应该保持不变“JohnSmith”

在第二个中,输出是

NAME        PATH
Smith       12345
John Smith  54321
JohnSmith   12345

这里第二行似乎不对,因为它应该删除“史密斯”

任何想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这将完成这项工作:

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