2017-01-23 107 views
0

我有一個帶撇號的字符串。例如Mark's House。在我的網址中,它的名字叫做www.mydomain.com/Marks-House/如何匹配字符串與撇號?

我想通過提供的名稱獲取數據庫條目,在本例中爲Marks-House。所以MySQL不知道在ks(Mar k's)之間有一個撇號。

在我的數據庫中,條目被保存爲帶有撇號的Mark's House

我的查詢:

SELECT 
id, title_de AS title, de AS wiki 
FROM pages 
WHERE MATCH (title_de) 
against ('+ Marks-House' in Boolean mode) 
OR title_de LIKE '%Marks-House' LIMIT 1 

是否有可能忽略像數據庫撇號,因爲我的URI路由自動添加爲-空間和撇號刪除該條目匹配字符?

+1

您還可以將格式化的名稱作爲單獨的列保存在數據庫記錄中嗎? –

+0

我想是的。這會更有效地推薦,然後嘗試將其與此答案的建議解決方案相匹配嗎? – AlexioVay

+0

我不知道效率。我只想匹配給出各種拼寫的正確域名?可以存儲各種格式化別名的域名。這意味着一些預處理來識別和存儲域名和變體。或者您處理存儲的原始文本。像往常一樣,這是一個折中的空間,時間和成本。 –

回答

2

您可以使用REPLACE()刪除'當你在做你的WHERE。例如;

mysql> select replace("Mark's house", "'", "") as new_value; 
+-------------+ 
| new_value | 
+-------------+ 
| Marks house | 
+-------------+ 
1 row in set 

這將使您的查詢以下;

SELECT 
id, title_de AS title, de AS wiki 
FROM pages 
WHERE replace(title_de, "'", "") = "Marks-House" LIMIT 1 
+0

謝謝!我有一個問題。你寧願建議添加一個新的列與完全匹配的名稱,以避免使用像'LIKE','MATCH'等(或在這種情況下'替換')功能,並更有效或不是這個重要? – AlexioVay

+1

@Vay是的,那很好,那麼你可以索引該領域,你的搜索查詢將更加優化和更快。 –

1

一種方法可以基於雙象

SELECT 
id, title_de AS title, de AS wiki 
FROM pages 
WHERE MATCH (title_de) 
against ('+ Marks-House' in Boolean mode) 
OR title_de LIKE '%Marks%' and title_de like '%House%' LIMIT 1 

或多個%

SELECT 
id, title_de AS title, de AS wiki 
FROM pages 
WHERE MATCH (title_de) 
against ('+ Marks-House' in Boolean mode) 
OR title_de LIKE '%Marks%House' LIMIT 1 

或者也可以是正則表達式

SELECT 
id, title_de AS title, de AS wiki 
FROM pages 
WHERE MATCH (title_de) 
against ('+ Marks-House' in Boolean mode) 
OR title_de REGEXP 'Marks.+House' LIMIT 1 
+0

謝謝您的解決方案建議!在你的最後一個例子中,這是否意味着我總是必須用'。+'替換字符串中的'-'?另外,你是否會建議添加一個具有完全匹配名稱的新列,以避免使用像LIKE,MATCH等函數,並且效率更高或不重要? – AlexioVay

+0

@Vay不..你不需要替換' - '...這個點是一個正則表達式的特殊字符,並且意味着每個字符..所以正則表達式爲Marsk每個字符和房子工作......希望很明確.. – scaisEdge