Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL不喜欢查询不工作_Php_Mysql_Database_Database Design - Fatal编程技术网

Php MySQL不喜欢查询不工作

Php MySQL不喜欢查询不工作,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我有两张桌子: 职位 标签 标记表的结构如下所示: 邮政编码 标签 因此,对于为帖子提供的每个标记,我在tags表中创建一条记录。如果一篇文章有10个标签,标签表中将有10条记录具有该文章id 我现在正在尝试构建一个搜索页面,用户可以在其中搜索标记不包含给定关键字的帖子。但这也带来了一个问题。类似以下的查询: SELECT DISTINCT posts.id, posts.title, posts.content FROM jobs, tags WHERE tags.tag

我有两张桌子:

  • 职位
  • 标签
标记表的结构如下所示:

  • 邮政编码
  • 标签
因此,对于为帖子提供的每个标记,我在tags表中创建一条记录。如果一篇文章有10个标签,标签表中将有10条记录具有该文章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
)
这将获取所有帖子的列表,不包括那些具有与指定的标签匹配的标签的帖子。(您最初的查询引用了一个“jobs”表。我假设这是“posts”的输入错误。)

把这个弄干净一点:

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

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

我刚刚发布了这篇文章(我应该在标记列上创建索引吗?标记列上的索引没有帮助,因为您正在对所有记录进行文本搜索。您需要在post_id列上创建索引。我应该创建以下索引:post{id,tag_id};Tags{post_id,tag}。然后,使用“explain plan”运行您的查询以查看它是否运行良好。)。