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 ;