2011-02-06 55 views
-1

我有以下tags表:如何使用標籤搜索查找網站?

web   | tags 
------------------------------------------------------------ 
google.com | search,google,searchengine,engine,web 
facebook.com | facebook,social,networking,friends 
youtube.com | video,youtube,videos,entertainment 
yahoo.com  | yahoo,search,email,news,searchengine 
bing.com  | search,searchengine,microsoft,bing,tools 

我想實現是通過標籤搜索得到的從該表中的網站列表。

如果例如通過google.com進行搜索,那麼我想從上面的示例表中列出yahoobing

我該如何用PHP和MySQL實現這一目標? (我已爲此表啓用FULL TEXT SEARCH

+4

雖然您可以使用此結構通過標籤進行搜索,但由於索引的原因,它不會執行最佳操作。考慮到正常化! – Konerak 2011-02-06 09:51:26

+1

+1進行標準化。它將使您的查詢更易於讀寫,並提高性能。 – 2011-02-07 20:52:06

+0

你能澄清你的意思嗎?「如果有人通過google.com進行搜索,那麼我想從上面的示例表中列出雅虎和bing」? – Justin 2011-02-09 08:05:23

回答

0

是不可能同時使用鏈接它們的表的Web表和標記表?

如果你的結構真的不能改變,那麼像SELECT * FROM web WHERE tags LIKE '%google%'這樣的東西可以工作。

2

像這樣的東西可能會給你想要的結果,但它會很慢。也許別人可以提供更有效的解決方案:

SELECT t1.* FROM tags AS t1 JOIN tags AS t2 
    ON LIST_INTERSECT(t1.tags, t2.tags) != '' 
    WHERE t1.web='google.com' 

而且你還需要這個存儲功能(只需複製和一旦你連接到服務器,並選擇你的數據庫將此代碼粘貼到mysql客戶端) :

DELIMITER $$ 
CREATE FUNCTION LIST_INTERSECT(
    list1 VARCHAR(255), list2 VARCHAR(255) 
) RETURNS VARCHAR(255) 
BEGIN 
    SET @delim = ','; 
    SET @list = list1; 
    SET @overlap = ''; 
    LOOPING: LOOP 
     IF (LOCATE(@delim, @list) > 0) THEN 
      SET @word = SUBSTRING_INDEX(@list, @delim, 1); 
      SET @list = SUBSTR(@list, LOCATE(@delim, @list) + 1); 
     ELSE 
      SET @word = @list; 
      SET @list = NULL; 
     END IF; 
     IF (CONCAT(',',list2,',') LIKE CONCAT('%,',@word,',%')) THEN 
      SET @newword = @word; 
      IF (@overlap != '') THEN 
       SET @newword = CONCAT(',', @word); 
      END IF; 
      SET @overlap = CONCAT(@overlap, @newword); 
     END IF; 
     IF (@list IS NULL) THEN 
      LEAVE LOOPING; 
     END IF; 
    END LOOP LOOPING; 
    RETURN @overlap; 
END$$ 
DELIMITER ; 

(該DELIMITER命令是改變從語句分隔符「;」到「$$」,並回到你需要這樣做,以便確定custom functions or procedures。)

本質上,這看起來代碼對於t中的一個站點他web列,然後它找到在tags列中共享其關鍵字的所有其他網站。使用此功能,如果您搜索「google.com」,則它還會返回「bing.com」和「yahoo.com」,因爲這三條記錄在tags中都有「搜索」和「searchengine」。