php - MySQL NOT LIKE 查询不工作

标签 php mysql database database-design

我有 2 个表:

  • 帖子
  • 标签

标签表的结构如下:

  • post_id
  • 标签

因此,对于为帖子指定的每个标签,我都会在标签表中创建一条记录。如果一个帖子有 10 个标签,那么标签表中将有 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 个记录没有那个关键字。

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

最佳答案

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

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”运行您的查询' 看看它是否表现良好。用结果更新你的问题,有人会提供进一步的建议。索引调优比其他任何事情都需要更多的试验和错误,因此确实有必要进行测试。

关于php - MySQL NOT LIKE 查询不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/500790/

相关文章:

mysql - 使用 LOAD DATA INFILE 时出现 1045 错误

php - Yii 1.1.x CDbHttpSession 错误 : CDbConnection failed to open the DB connection: could not find driver

php - Bigquery PHP 使用插入选择作业填充表

php - 使用 PHP 创建 TYPO3 加盐密码?

php - mysql_fetch_assoc 函数替换

php - 将多个文本框的数据插入到单列

mysql - 如何找到列名长度大于 5 的所有列?

sql-server - 使用 Microsoft SQL Server 从另一个基于列的表更新表

C# 处理多种数据库类型?

sql-server - 如何一次插入1000行