Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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 在下一次查询中使用SQL查询的结果_Php_Mysql - Fatal编程技术网

Php 在下一次查询中使用SQL查询的结果

Php 在下一次查询中使用SQL查询的结果,php,mysql,Php,Mysql,我正在尝试制作一个基于标签的CMS/博客。没什么复杂的,因为这主要是一个学习练习。我正在使用PHP和MySQL,尽管我怀疑如果将自定义DB代码写入磁盘,这会更容易 无论如何,我想有两个表,一个标签列表,有名称和id,一个帖子列表,有内容,还有一个标签id列表。但是,似乎不能将整数数组放在表的单个字段中。所以我制作了第三个表,posttags,它包含OwningPost和TagID。表中有多个重复的OwningPost,每个都有不同的TagID,因此一篇文章可以有多个标记。这看起来不太干净,但我想

我正在尝试制作一个基于标签的CMS/博客。没什么复杂的,因为这主要是一个学习练习。我正在使用PHP和MySQL,尽管我怀疑如果将自定义DB代码写入磁盘,这会更容易

无论如何,我想有两个表,一个标签列表,有名称和id,一个帖子列表,有内容,还有一个标签id列表。但是,似乎不能将整数数组放在表的单个字段中。所以我制作了第三个表,posttags,它包含OwningPost和TagID。表中有多个重复的OwningPost,每个都有不同的TagID,因此一篇文章可以有多个标记。这看起来不太干净,但我想不出更好的了

现在,我想得到一个列表,列出所有有特定标签的帖子,而没有特定的其他标签。我甚至还没有找到not标签,我仍然停留在包含指定标签的帖子上。我有以下代码:

printPostsTagged(array('Blog Post'),array('First')); 
function printPostsTagged($iTags,$eTags)
{
 $tagQ="SELECT ID from tags WHERE (";
 for($i=0;$i<count($iTags)-1;$i++)
    $tagQ=$tagQ."Name='".$iTags[$i]."' OR ";
 $tagQ=$tagQ."Name='$iTags[$i]')";
 $tagR=mysql_query($tagQ);
     ...
它通过使用ORs将所有ITAG包含的标记串在一起进行查询,这将获得ITAG中每个标记的ID列表,现在我想使用整个列表从posttags中选择OwningPost,然后使用该索引列表从posts表中获取所有对应的帖子的列表

我以前没有使用过SQL,但我的谷歌搜索似乎没有发现任何问题,我强烈感觉我在这里做了一些完全错误的事情

zacaj

在我看来,您似乎正在尝试执行子查询。我在这里发布了一个类似的例子:


实际上,您的数据库设计是正确的——我想不出比使用这3个表更干净的方法了。您的SQL查询应该如下所示:

SELECT * FROM content_table INNER JOIN OwningPost ON content_table.postID = OwningPost.postID WHERE OwningPost.tag = 'tag1' OR OwningPost.tag = 'tag2' etc...

让我知道是否可以…

要获得良好的表架构,请查看:

通常项目不是按标记名查询的,而是按标记id或标记查询的,无论如何,您可以使用联接简化您的函数:

function printPostsTagged($iTags, $eTags) {
  $in = '"' . implode('", "', array_map('mysql_real_escape_string', $iTags)) . '"';
  $sql = "SELECT p.* FROM posts p 
   INNER JOIN post_tag pt ON pt.post_id = p.post_id
   INNER JOIN tags t ON pt.tag_id = t.tag_id
  WHERE name IN ($in)";

  // it removes duplicates and fetch just the posts with all the iTtags assigned     
  $sql .= " GROUP BY p.id HAVING COUNT(p.id) = " . count($iTags); 

}

第三个表被称为连接表或链接表。这是建立模型的正确方法。正是这些关系使关系数据库成为关系数据库。正如Brandon所指出的,您应该使用子查询。不要担心您可能会丢弃第一次查询中的数据。那很好。此外,正如ThiefMaster所指出的,您应该使用IN代替,或者在可能的情况下使用。

您知道SQL支持WHERE col IN“list”、“of”、“values”吗?我以前从未使用过SQL-请阅读:另外,您可能会发现Stack Exchange数据转储模式很有趣:这看起来不太干净,但我想不出更好的方法。不,恰恰相反,这是最好的方法!事实上,您重新发明了中间或关联或连接表,用于多对多关系一个帖子可以有多个标记,一个标记可以标记多个帖子。祝贺你,有人能帮忙排除吗?没有什么可以否定的,我在网上也找不到任何东西。我肯定有一些东西,但我不太了解内部连接的工作原理,包括两个连接,也不知道搜索子查询的语法可以很好地工作,但是通常比连接要慢。是否有方法将具有相同帖子的帖子连接在一起。Name?@zacaj:您可以尝试通过添加一个GROUP by并使用各种aggegate函数来处理此查询。此外,这似乎可以找到包含任何ITAG的帖子,我只需要包含所有iTags的帖子就可以找到包含所有iTags的帖子:$sql.=groupby p.id HAVING COUNTp.id=。数一数$ITAG;