Php 如何使用标签搜索查找网站?

Php 如何使用标签搜索查找网站?,php,mysql,full-text-search,Php,Mysql,Full Text Search,我有以下标签表格: web | tags ------------------------------------------------------------ google.com | search,google,searchengine,engine,web facebook.com | facebook,social,networking,friends youtube.com | video,youtube,videos,entertainment

我有以下
标签
表格:

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
进行搜索,那么我想从上面的示例表中列出
yahoo
bing


如何使用PHP和MySQL实现这一点?(我已为此表启用了
全文搜索

是否不可能同时使用web表和标记表以及将它们链接在一起的表


如果您的结构真的无法更改,那么类似于“%google%”之类的标签的
SELECT*FROM-web将起作用。

这样的东西可能会给您想要的结果,但速度会非常慢。也许其他人可以提供更有效的解决方案:

SELECT t1.* FROM tags AS t1 JOIN tags AS t2
  ON LIST_INTERSECT(t1.tags, t2.tags) != ''
  WHERE t1.web='google.com'
您还需要这个存储函数(连接到服务器并选择数据库后,只需将此代码复制并粘贴到mysql客户端):

(使用
DELIMITER
命令将语句分隔符从“;”更改为“$$”并返回。您需要执行此操作才能定义。)


基本上,此代码在
web
列中查找一个站点,然后在
标记
列中查找所有共享其关键字的其他站点。使用此方法,如果您搜索“google.com”,它也会返回“bing.com”和“yahoo.com”,因为这三个记录在
标签中都有“search”和“searchengine”

虽然您可以使用此结构按标签搜索,但由于索引的原因,它的性能不会最佳。考虑正常化+1.正常化。这将使您的查询更易于阅读和编写,并提高性能。您能否澄清“如果有人在google.com上搜索,那么我想从上面的示例表中列出yahoo和bing”是什么意思?我认为该查询不起作用。没有名为
web
的表,只有google.com行的
tags
列中包含“google”。哦,是的,意思是
web
不是
tags
。也明白你的意思,但我认为OP不想通过
google.com
进行搜索。一定是打字错误吧?正如OP所说的“按标签搜索”。当然,除非OP试图通过
google.com
返回的标签进行搜索。在这种情况下,您的很长的SQL代码段看起来很好:Phow我应该存储这个函数吗???@aron:如果您复制并粘贴从
delimiter$$
END$$
的所有内容,它应该会自动存储该函数。但是,您需要从具有insert权限的用户处执行此操作。
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 ;