在我的网站上,我有一个系统可以对表T.Categories上的内容进行MySQL字符串的分类,如下所示
category1;category2;category3;category4(可能或多或少)。
另一方面,我让我的用户选择他们感兴趣的类别。基本上,他们在表单上做出选择,结果在PHP变量$var中列出如下所示
category2','category4','category5(等)
通过请求
T.Categories IN ('".$var."'))";我能够确定内容是否符合他们的兴趣,只有当内容被分类在一个单独的类别下时。
举个例子:
SELECT * FROM T Where T.Categories IN ('".$var."'))";。实际上,我告诉SGBD查看T.Categories的内容是否在列表$var中
当T.Categories中只有一个类别时,它就起作用了。“猫在$var吗?是的,猫喜欢‘猫’,‘狗’。然后我把内容交给用户(因为猫在$var中)。”
但是,如果T.Categories中有多个类别,它就不再起作用了。因为整个类别都存储在表单分类1;分类2;分类3;类别4下。不幸的是:字符串‘猫;马;鸭子’没有进入‘猫’,‘狗’(MySQL正在寻找整个字符串)
我需要的是分三部分解析猫、马、鸭,以便使SGBD查找$var列表中的每个部分。猫在$var吗?是的,猫喜欢“猫”,“狗”。马在$var吗?不,马不喜欢‘猫’,‘狗’。鸭子在$var吗?不,鸭子不喜欢‘猫’,‘狗’。然后我将内容提供给用户(因为猫在$var中)。
我如何才能达到我的目标,使用一个单一的请求?
发布于 2013-10-28 12:26:50
你的设计有问题。不应将类别存储在MySQL中的字符串中。
您应该将类别存储在一个新表中,并使用一个多对多表将两者连接起来:

一旦您有了一个多到多的表,将您的文章链接到您的类别,您就可以根据类别检索文章,并对匹配所需关键字的程度进行评估。
SELECT A.*, L.Relevance
FROM Article AS A
INNER JOIN
(
SELECT AC.ArticleID, COUNT(AC.CategoryID) AS Relevance
FROM ArticleCategory AS AC
INNER JOIN Category AS C
ON AC.CategoryID = C.CategoryID
WHERE C.Name IN ('Cat','Dog','Donkey','Chicken')
GROUP BY AC.ArticleID
) AS L
ON A.ArticleID = L.ArticleID
ORDER BY L.Relevance DESC, Name你可以看到一个SQLFiddle中的示例。
您还可以在这里获得更多信息:
另一种方法是在MySQL中使用全文搜索函数。这里有更多信息:
发布于 2013-10-28 11:26:08
实际上,您应该将这些类别存储在每个用户的行中,而不是这样做,这将使您的查询变得简单,而且也将更加规范化。但是,这将意味着对表结构的更改。
如果您不能这样做,您是否可以像这样生成select请求:
SELECT * FROM T Where concat(';', T.Categories, ';') like '%;cat;%' or
concat(';', T.Categories, ';') like '%;dog;%'如果使用引导和尾随分号存储T.Categories,则不需要使用concat。这将意味着对表T的扫描,即无法使用索引。
https://stackoverflow.com/questions/19632458
复制相似问题