这是我第一次在这里发帖!希望得到一个好的回复。
我有两个表,根据我需要找到的路径,并用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
这里第二行似乎不对,因为它应该删除“史密斯”
任何想法?
答案 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