【问题标题】:Seaching using tags in PHP/MySQL在 PHP/MySQL 中使用标签进行搜索
【发布时间】:2011-09-05 19:46:54
【问题描述】:

我正在努力寻找解决方案。我有以这种形式插入数据库的标签

mytags=firsttag, secondtag, thirdtag

在单个页面上,我需要根据这些标签显示相关项目,因为我正在使用

SELECT * FROM posts WHERE tags LIKE \"%$mytags%\" ORDER BY views DESC LIMIT 5"

但是这并没有多大作用,因为它只搜索具有完全相同标语(firsttag、secondtag、thirdtag)的帖子,而不是其标签包含其中一个标签(firsttag、anothertag 和anothertag)的帖子。

我想过分解mytags,然后使用数组中的第一个标签进行搜索,但这不是很好。

有人知道有效的搜索方法吗?

【问题讨论】:

    标签: php mysql database tags


    【解决方案1】:

    为什么不使用单独的表格来保存帖子标签?我的意思是例如表'posts'、表'tags'和关系表'posts_tags'。 这是“帖子”的结构:

    id
    title
    content
    

    这是“标签”的结构:

    id
    tag_name
    

    这里是结构 if 'posts_tags':

    id
    post_id
    tag_id
    

    这是“多对多”关系模型的方案。您现在可以通过 JOIN 运算符轻松查找标签或/和帖子。

    【讨论】:

    • “posts_tags”中的“id”属性甚至不是必需的。
    • 是的,但是如果您想删除其中一个关系规则怎么办?
    • DELETE ... WHERE post_id=... AND tag_id=... 有什么问题?
    • 没什么。但是按ID删除更美观,逻辑和紧凑。如果需要,也可以对 ID 进行索引。
    • 您也可以索引 post_id 和 tag_id。在谈论关系时,谈论 post_id=5 和 tag_id=9 而不是 ID=2 与任何有用的东西无关。
    【解决方案2】:

    这不是正确的方法。您的数据库未标准化。简而言之,不可能做你想做的事,即使是,那也是非常无效的。

    您必须创建另一个表 - Tags,然后创建另一个表来表示标签与帖子的连接,比如说 TagsPosts,所有内容都已正确编入索引。

    【讨论】:

    • 是可能的:-) 但没有优化
    • @ajreal,请发布您的解决方案,我想它会与所有当前答案产生很大的不同。
    • 使用或比较三个标签..有计数>=1
    • 是的,并处理所有异常,例如 abc 匹配 abcd 标签、空格和动态生成 mysql 查询。无法使用任何索引,让事情变得非常缓慢。 :)
    • 我的目的是指出可能,而不是像你说的那样
    【解决方案3】:

    您可能想查看find_in_set(),但我强烈建议您规范化您的数据库并使用适当的结构。

    【讨论】:

    • 不错的发现!我不知道。
    • find_in_set() 返回一个整数 no?
    • @Kbr89 是的(或 NULL)。
    【解决方案4】:

    您应该始终keep your data normalised(每列中有一条数据)。使用两个表可以解决此问题;一个用于标签,一个用于帖子,一个 MySQL LEFT JOIN。下面是一个非常简单的示例。

    posts

    id  int(11) Auto Increment   
    title   char(255)
    

    tags

    id  int(11)  
    postid  int(11)  
    tag char(64)
    

    查询标签包含firstpost的帖子

    (重要)

    SELECT p.title FROM posts p
    LEFT JOIN tags t
    ON t.postid=p.id
    WHERE t.tag LIKE '%firstpost%'
    

    样本数据

    INSERT INTO `posts` (`id`, `title`) VALUES
    (1, 'Post number 1'),
    (2, 'Another post'),
    (3, 'Third post');
    
    INSERT INTO `tags` (`id`, `postid`, `tag`) VALUES
    (0, 1,  'first_post'),
    (0, 1,  'firstpost_secondtag'),
    (0, 2,  'secondpost_firsttag');
    

    正如我上面所说,这是一个非常简单的示例。这里最重要的一点是使用LEFT JOIN 和一个单独的标签表。您应该很明显,您只需将 LIKE 语句中的 firstpost 替换为 PHP 变量即可。

    【讨论】:

    • 我正在考虑这样做,但我想让我的程序保持简单。好像我别无选择。谢谢
    • 我的问题看起来很长,但这很简单; tags 表至少需要两个字段;标签文本和使用该标签的帖子 ID。您的posts 表不需要更改;只有SELECT 查询,它很短。你可以扩展这个例子来使用一个中间表,这样你就有一个标签列表,以及帖子和这个标签列表之间的一种“接口”。
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 2019-11-16
    • 2021-05-23
    • 2017-07-10
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多