【问题标题】:MySQL NOT LIKE query not workingMySQL NOT LIKE 查询不起作用
【发布时间】:2010-10-04 18:53:57
【问题描述】:

我有 2 张桌子:

  • 帖子
  • 标签

标签表的结构如下:

  • post_id
  • 标签

因此,对于为帖子提供的每个标签,我都会在标签表中创建一条记录。如果一个帖子有 10 个标签,那么 tags 表中就会有 10 条记录具有该 post_id。

我现在正在尝试构建一个搜索页面,用户可以在其中搜索标签不包含给定关键字的帖子。但是,这会产生一个问题。像这样的查询:

SELECT DISTINCT posts.id, posts.title, posts.content
   FROM jobs, tags
   WHERE tags.tag NOT LIKE '%$keywords%' AND posts.id=tags.post_id

不起作用,因为如果一个帖子有6个标签,其中一个有关键字,它仍然会被返回,因为标签表中的其他5条记录没有那个关键字。

解决这个问题的最佳方法是什么?除了在帖子表中创建一个新列来存储所有仅用于搜索的逗号分隔标签之外,还有其他方法吗??

【问题讨论】:

    标签: php mysql database database-design


    【解决方案1】:

    确保你有索引,否则这会很糟糕:

    SELECT posts.id, posts.title, posts.content
    FROM posts 
    WHERE NOT EXISTS (
      SELECT post_id from tags
      WHERE tags.tag LIKE '%$keywords%' 
        AND posts.id=tags.post_id
    )
    

    这将获取所有帖子的列表,不包括那些与您指定的标签匹配的标签。 (您的原始查询引用了“工作”表。我认为这是“帖子”的拼写错误。)

    Table aliases 让它更干净一点:

    SELECT p.id, p.title, p.content
    FROM posts p
    WHERE NOT EXISTS (
      SELECT t.post_id from tags t
      WHERE t.tag LIKE '%$keywords%' 
        AND p.id=t.post_id
    )
    

    然后,我会创建这些索引:

    Posts: id, tag_id
    Tags: post_id, tag
    

    然后,使用“explain”运行您的查询,看看它是否运行良好。用结果更新您的问题,有人会提供进一步的建议。索引调优比其他任何事情都需要反复试验,因此确实需要进行测试。

    【讨论】:

    • 我只是在发布那个... :(
    • 我应该在标签列上创建索引吗?
    • 标签列上的索引将无济于事,因为您正在对所有记录进行文本搜索。您需要 post_id 列上的索引。
    • 我会创建这些索引: Posts{id, tag_id};标签{post_id,标签}。然后,使用“解释计划”运行您的查询,看看它是否表现良好。
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2011-10-02
    相关资源
    最近更新 更多