我無法找到任何真正幫助我解決這個問題的東西。 我有以下結構的數據庫:mySql - 基於關鍵字的搜索查詢
和一個簡單的查詢來搜索並顯示從數據庫中的一些結果:
if ($_REQUEST['search']) {
$q = $_REQUEST['search'];
$q_comma = explode(", ", $q);
$where_in_set = '';
$count = count($q_comma);
foreach ($q_comma as $q) {
$counter++;
if ($counter == $count) {
$where_in_set .= "FIND_IN_SET('$q','keywords')";
} else {
$where_in_set .= "FIND_IN_SET('$q','keywords') AND ";
}
}
$sql_res = "select link, description, keyword from myDB where $where_in_set or description like '%$q%'";
此代碼的工作,但不是真的,因爲我想。
在關鍵字列中,我有不同的以逗號分隔的關鍵字,並且即使訂單不同,我也希望能夠搜索它們。
下面是一個例子:比方說,我有到我的關鍵字列
谷歌,Facebook,Twitter的
以我目前的代碼,如果我鍵入谷歌,我可以看到的結果,但如果我鍵入Twitter,我沒有看到它。
有什麼我可以做的,使其工作,而不考慮關鍵字的順序,但也有一個非常快的搜索?
任何幫助將非常感激。
PS。如果可能的話,我只想保留一個數據庫,因爲我閱讀了關於創建一個只有ID和關鍵字的新表,並且在我的搜索中加入了ID上的表,但如果可能的話,我更喜歡更好的解決方案。
感謝
編輯
有些更新:
- 由@Frayne Konok指出,我有在lowcase分貝在lowcase查詢和所有的價值,以及,所以案件不能成爲問題
- 正如@mkaatman所建議的那樣,我圍繞反引號(')列包裹
- 我改變了我的查詢,以便現在它看起來像一個在答覆@ user2272989建議
所以我的查詢現在看起來是這樣的:
select link, description, keyword from myDB
where (FIND_IN_SET('google',`keyword`) or
FIND_IN_SET('facebook', `keyword`) or
FIND_IN_SET('twitter', `keyword`))
OR description like 'google, facebook, twitter'
而且它如果連返回值順序是不同的,但它不是隻顯示我想要的。 例如,如果我編寫推特,谷歌,臉書,我有一個像28行,其中只有2個所有的三個詞作爲關鍵字,而另一個我只有一個或兩個
編輯2 - 更新
我只是想「重新打開」這個問題,因爲我沒有設法解決這個問題。如果我將所有關鍵字都改爲對象,那麼最好將它們用作關鍵字?或者什麼是絕對最好和更可靠的方法來搜索數據庫的關鍵字?擁有不同的DB並使用INNER JOIN?
在這一點上,我願意改變結構和代碼,如果它有幫助。
感謝
這是否工作? 'SELECT FIND_IN_SET('Twitter','Google,Facebook,Twitter'); '我會''var_dump($ q);'在foreach中確保你正在檢查你認爲你在檢查的內容。另外,我不認爲關鍵字應該用引號括起來。 – mkaatman
大小寫可能是問題,您可以在'description'中嘗試'LOWER'。例如:'LOWER(描述)',如'%$ q%''。也''strtolower''$ q' –
@mkaatman沒有關鍵字引號我有一個語法錯誤,說「表中的未知列關鍵字」 – Nick