我有以下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
进行某次搜索,我想从上面的示例表中列出yahoo
和bing
。
如何使用PHP和MySQL实现这一目标? (我为此表启用了FULL TEXT SEARCH
)
答案 0 :(得分: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。)
基本上,此代码会在web
列中查找某个网站,然后会找到在tags
列中共享其关键字的所有其他网站。使用此功能,如果您搜索“google.com”,它还会返回“bing.com”和“yahoo.com”,因为所有这三条记录都在tags
中有“搜索”和“搜索”。
答案 1 :(得分:0)
是否不可能同时拥有一个Web表和标签表以及将它们连接在一起的表?
如果你的结构真的无法改变,那么像SELECT * FROM web WHERE tags LIKE '%google%'
这样的东西就可以了。