2012-07-26 86 views
3

我有以下表格。mysql搜索標題,描述和多行標記

的條目表描述

+-------------+-------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+-------------------+------+-----+---------+----------------+ 
| id   | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| title  | varchar(255)  | YES |  | NULL |    | 
| slug  | varchar(255)  | YES |  | NULL |    | 
| description | text    | YES |  | NULL |    | 
| user_id  | int(10) unsigned | NO |  | NULL |    | 
| unsafe  | enum('0','1')  | NO |  | NULL |    | 
| copyright | enum('0','1')  | NO |  | 0  |    | 
| status  | enum('0','1','2') | NO |  | 0  |    | 
| date_add | datetime   | NO |  | NULL |    | 
+-------------+-------------------+------+-----+---------+----------------+ 

標記表中描述

+-------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+---------------------+------+-----+---------+----------------+ 
| id   | bigint(20) unsigned | NO | PRI | NULL | auto_increment | 
| relation_id | int(10) unsigned | NO |  | NULL |    | 
| name  | varchar(255)  | NO |  | NULL |    | 
+-------------+---------------------+------+-----+---------+----------------+ 

我想在entry.title和tag.name搜索。這個查詢的性能如何?

我繼續使用全文搜索。你怎麼 ?

+0

對於標題,您可以使用帶有全文本的union:1-st查詢;第二個查詢連接的標籤並使用'tag.name IN('tag1','tag2'..)'。假設你想要一個完整的單詞匹配標籤。 – Vatev 2012-07-26 17:00:59

+0

vatev謝謝你的回答。你可以寫回答的任何示例查詢? – alioygur 2012-07-26 17:03:15

回答

1

首先,您需要確保標題和名稱字段都已編入索引(無法通過您發送的信息查看)我假設tag.relation_id與entry.id相關,因此您可以像這樣搜索:

SELECT * FROM entry as e JOIN tags as t on e.id = t.relation_id WHERE e.title LIKE('%YOURSEARCH%') OR t.name LIKE('%YOURSEARCH%') 
+0

它看起來不太好。如果匹配我想要的搜索結果的標籤。或匹配標題我想要搜索結果 – alioygur 2012-07-26 17:04:59

1

我不知道該標籤如何與項目,所以我要去承擔relation_id是項ID。

SELECT 
    e.* 
FROM entry e 
WHERE MATCH(title) AGAINST ('{search string}') 
{maybe a limit and/or order here} 
UNION 
SELECT 
    DISTINCT 
    e.* 
FROM entry e 
JOIN tags t ON t.relation_id = e.id 
WHERE t.name IN ('word1','word2',...)#{search string} split by whitespace 
{maybe a limit and/or order here} 
1

你的意思是顯示屬性列entry . titletag . name加入entry . user_id分成tag . relation_id?如果這是你想要的,你可以檢查下面的SQL查詢:

SELECT entry . title , tag . name 
FROM entry 
INNER JOIN tag ON entry . user_id = tag . relation_id 
ORDER BY entry . title 

現在,如果你使用查詢字符串搜索的entry . titletag . name屬性的值,試圖檢查這個代碼:

$q = $_GET["q"]; 

$result = mysqli_query($con, 'SELECT entry . title , tag . name 
FROM entry 
INNER JOIN tag ON entry . user_id = tag . relation_id 
WHERE entry . title LIKE "%' . $q . '%" 
OR tag . name LIKE "%' . $q . '%"'); 

例如,當搜索到domain.com/?q=test然後系統會看,如果有一個爲測試entry . titletag . name匹配的文本,如果曾經創立了一些,行*(S)* entry . titletag . name,其中包括該詞將是一個結果。

現在如果你想顯示查詢字符串?q =然後只是SELECT *的值的所有屬性。檢查了這一點:

$q = $_GET["q"]; 

$result = mysqli_query($con, 'SELECT * 
FROM entry 
INNER JOIN tag ON entry . user_id = tag . relation_id 
WHERE entry . title LIKE "%' . $q . '%" 
OR tag . name LIKE "%' . $q . '%"'); 

或者TableName . AttributeField小號手動,包括所有有這樣的:

$q = $_GET["q"]; 

$result = mysqli_query($con, 'SELECT entry . id , entry . title , entry . slug , entry . description , entry . user_id , entry . copyright , entry . status , tag . id , tag . relation_id , tag . name 
FROM entry 
INNER JOIN tag ON entry . user_id = tag . relation_id 
WHERE entry . title LIKE "%' . $q . '%" 
OR tag . name LIKE "%' . $q . '%"'); 

附:不要忘記將「標籤」表格改名爲「標籤」

1

所以你正在尋找一個系統來搜索標題,然後使用標籤縮小結果。這是你想要的?

要做到這一點首先顯示的標題搜索結果,然後有標籤的鏈接 這樣的事情很頁面 「MySQL的搜索標題,描述和多行標籤」是你的標題和結果,並在結果顯示標籤作爲按鈕「mysql search full-text-search」當點擊標籤時顯示特定的結果。

如果您可以提供更多信息或想要實現的場景,將有助於我們爲您提供更好的解決方案。

+0

也不要忘記添加索引鍵標題和標籤,以提高性能。 – 2013-04-11 23:49:16

1
SELECT entries.id, entries.title 
FROM entries 
INNER JOIN tags ON entries.id = tags.relation_id 
WHERE tags.name IN ("tag1", "tag2", "tag3") AND MATCH(entries.title, entries.description) AGAINST ('{text}')