首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定字符串‘word5 1;word5 2;word5 3;word5 4’中的元素'word4‘是否在字符串’word5 4‘、’word5 5‘、’word5 6‘、’word5 7‘中?

如何确定字符串‘word5 1;word5 2;word5 3;word5 4’中的元素'word4‘是否在字符串’word5 4‘、’word5 5‘、’word5 6‘、’word5 7‘中?
EN

Stack Overflow用户
提问于 2013-10-28 10:32:43
回答 2查看 95关注 0票数 1

在我的网站上,我有一个系统可以对表T.Categories上的内容进行MySQL字符串的分类,如下所示

代码语言:javascript
复制
category1;category2;category3;category4

(可能或多或少)。

另一方面,我让我的用户选择他们感兴趣的类别。基本上,他们在表单上做出选择,结果在PHP变量$var中列出如下所示

代码语言:javascript
复制
category2','category4','category5

(等)

通过请求

代码语言:javascript
复制
T.Categories IN ('".$var."'))";

我能够确定内容是否符合他们的兴趣,只有当内容被分类在一个单独的类别下时。

举个例子:

  • 我有一张照片叫“猫”
  • 我的用户想看属于“猫”和“狗”类的照片
  • 我的SQL请求看起来像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中)。

我如何才能达到我的目标,使用一个单一的请求?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-28 12:26:50

你的设计有问题。不应将类别存储在MySQL中的字符串中。

您应该将类别存储在一个新表中,并使用一个多对多表将两者连接起来:

一旦您有了一个多到多的表,将您的文章链接到您的类别,您就可以根据类别检索文章,并对匹配所需关键字的程度进行评估。

代码语言:javascript
复制
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中使用全文搜索函数。这里有更多信息:

  • http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
  • http://viralpatel.net/blogs/full-text-search-using-mysql-full-text-search-capabilities/
票数 0
EN

Stack Overflow用户

发布于 2013-10-28 11:26:08

实际上,您应该将这些类别存储在每个用户的行中,而不是这样做,这将使您的查询变得简单,而且也将更加规范化。但是,这将意味着对表结构的更改。

如果您不能这样做,您是否可以像这样生成select请求:

代码语言:javascript
复制
SELECT * FROM T Where concat(';', T.Categories, ';') like '%;cat;%' or
                      concat(';', T.Categories, ';') like '%;dog;%'

如果使用引导和尾随分号存储T.Categories,则不需要使用concat。这将意味着对表T的扫描,即无法使用索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19632458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档