2010-06-17 92 views
0

我有一行有這樣的關鍵字(關鍵字1,關鍵字2,關鍵字3),用逗號分隔,如圖所示。當用戶登錄時,您知道他想要關於(keyword1,keyword3)的信息。現在,我有另一個表格,其中包含與不同關鍵字相關的一堆信息,該表格有一行稱爲(關鍵字)的行,表示該信息是否適合哪個關鍵字。如何根據關鍵字爲用戶呈現他所需的信息。換句話說,如果用戶想要關於(關鍵詞3,關鍵詞1)的信息,我該如何去(信息)表並且找到在該行中具有該詞語(關鍵詞1)或詞語(關鍵詞3)的所有信息(關鍵詞)?如何在MYSQL中搜索某一行中的特定單詞?

對不起,如果這是複雜的(我的解釋),但我盡我所能解釋它。

預先感謝您:)

回答

2

請標準化您的表格,並且對單個字段中的逗號分隔值非常懷疑。更靈活的設置是:

USERS
ID

關鍵詞
ID(或只使用名稱作爲主鍵)

...

USER_KEYWORDS
USER_ID
keyword_id

信息
ID
數據

INFORMATION_KEYWORDS
information_id
keyword_id

你得到的查詢會是這樣的:

SELECT information.data 
FROM users 
JOIN user_keywords ON user_keywords.user_id = users.id 
JOIN information_keywords ON information_keywords.keyword_id = user_keywords.keyword_id 
JOIN information ON information_keywords.information_id = information.id 
WHERE users.id = <id> 
+0

謝謝你的建議,我會盡我所能在我能夠儘快更改數據庫結構 – user220755 2010-06-17 20:09:30

+0

我得到了不是唯一的表/別名:信息 – user220755 2010-06-17 20:40:32

+0

沒關係,明白了:) – user220755 2010-06-17 20:47:19

2

使用MySQL FIND_IN_SET function在您的SQL查詢,像這樣:

FROM TABLE t 
WHERE FIND_IN_SET(t.keywords, 'keyword1, keyword3') > 0 
+0

會發現所有的行有關鍵字1或關鍵字3(我的意思是他們不必有兩個關鍵字是地址,因爲lon因爲他們至少有一個,這很好)這是否適用於這種情況? (t.keywords)是指什麼? – user220755 2010-06-17 19:06:24

+0

@ user220755:是的,只要其中一個關鍵字存在於您的表格中 - 該記錄將被返回。 – 2010-06-17 19:07:45

+0

和t.keywords代表什麼(只是讓我知道用什麼來代替它:))謝謝! – user220755 2010-06-17 19:08:17

1

數據庫設計的首要規則:每行存儲一個值。

換句話說,您應該修改數據庫以將每個關鍵字存儲在單獨的行中。

+0

謝謝你的建議,我會盡我所能改變數據庫結構我很快就可以 – user220755 2010-06-17 20:10:28

1

您是否考慮過更改數據模型?

目前,您在一列中有一個小型表格。也就是說,關鍵字列包含多個值,用逗號分隔。您將很難匹配這些關鍵字。

一個更好的解決辦法是做一個表UserKeywords:

User Keyword 
Paul snacks 
Paul food 
Paul beer 
Kelly snacks 
Kelly wine 

這樣,您就可以加入這個表對信息和用戶表。

+0

謝謝你的建議,我會盡我所能改變數據庫結構 – user220755 2010-06-17 20:09:57

0

Sjoerd是正確的。關係數據庫設置絕對是最好的解決方案。 我不知道關於MySQL FIND_IN_SET(),但你可以分析出用戶的關鍵字並撰寫字符串,因此您的搜索查詢會因爲這樣的事情結束了:

SELECT * FROM `information` WHERE MATCH(`keyword`) AGAINST('keyword1 keyword3' IN BOOLEAN MODE) 

在這種情況下,您的對陣應該返回如果它匹配任何一個。

您應該記住,「關鍵字」列必須全文索引,以便與工作匹配,並且僅匹配服務器上php.ini配置中定義的最小字符數。在大多數情況下,默認值是4個字符。 換句話說,您的關鍵字必須是4個或更多字符以使用匹配。 話雖這麼說,你可以設置你的查詢字符串做這樣的事情:

$user_keywords = array('keyword1', 'keyword3'); 

if(count($user_keywords) == 1) 
{ 
    $word = $user_keywords[0]; 

    if(strlen($word) >= 4) 
    { 
     $query_str = "MATCH(`keyword`) AGAINST ('".$word."' IN BOOLEAN MODE)"; 
    } 
    else 
    { 
     $query_str = "`keyword` LIKE '%".$word."%'"; 
    } 

} 
else 
{ 
    $query_str = ""; 
    foreach($user_keywords AS $key) 
    { 
     $query_str .= "`keyword` = '".$key."' OR "; 
    } 
    $query_str = substr($query_str, 0, -3); 
} 

$sql = "SELECT * FROM `information` WHERE ".$query_str; 

無論哪種方式,你這樣做,你真的應該用你的數據庫轉換爲關係建立開始,除非你別無選擇 - 像你正在使用你沒有編碼的第三方軟件包,它將需要永久轉換。

另外,%在那裏作爲部分匹配的例子。如果您需要更多解釋,請告訴我們。

0

當進行關鍵字類型查詢時(希望通過sjoerd來解釋每行代碼的方法,我非常喜歡MySql中很少使用的REGEXP特性,類似於它,它可以對所有字符進行部分搜索。在沒有搜索查詢的各個部分所需的所有特殊字符類似的數據單元格把它看成是谷歌針對MySQL的

一個例子:

SELECT * from表where值REGEXP「富」

相關問題