Php 查找具有多个标记的帖子

Php 查找具有多个标记的帖子,php,mysql,Php,Mysql,我正在搜索带有多个标签的帖子,并且已经找到了下面的代码,是否有更好的方法来实现这一点,或者这样可以吗 我的MySQL数据库有三个表post、tags和post\U tags 帖子:id | body 标记:标记|模式 post|标记:POSTD|标记 每个hvPost上的每个标记都有自己的列 if(isset($_GET["query"])){ $query = trim($_GET['query']); $searchs = explode(",", $query);

我正在搜索带有多个标签的帖子,并且已经找到了下面的代码,是否有更好的方法来实现这一点,或者这样可以吗

我的MySQL数据库有三个表post、tags和post\U tags

帖子:id | body 标记:标记|模式 post|标记:POSTD|标记 每个hvPost上的每个标记都有自己的列

     if(isset($_GET["query"])){
    $query = trim($_GET['query']);
    $searchs = explode(",", $query);
    $results = DB::query('SELECT * FROM post_tags WHERE tag=:tag', array(':tag' => $searchs[0]));
    $posts = "";
    foreach($results as $result){
        $pass = true;
        foreach($searchs as $search){
            if(DB::query('SELECT * FROM post_tags WHERE post_id=:postid AND 
tag=:tag', array(':postid' => $result['post_id'], ':tag' => $search))){

            }else{
                $pass = false;
                break;
            }
        }
        if($pass){
            $posts .= $result['post_id'];
        }
    }
    echo $posts;
}
我主要担心的是,如果一个标签有数百万条帖子,它不会在数百万条听起来效率不高的东西之间循环

编辑:

查询方法

     public static function query($query, $params = array()) {
    $statement = self::connect()->prepare($query);
    $statement->execute($params);
    if (explode(' ', $query)[0] == 'SELECT') {
        $data = $statement->fetchAll();
        return $data;
    }
}

请出示你们的桌子好吗。 或者,您可以在表中添加关系,并像这样使用查询sql

SELECT * FROM posts p
left join post_tags pt on pt.post_id =  p.id
left join tags t on pt.tag_id = t.id
WHERE t.tag = '$searchs[0]' 
我认为像%$searchs[0]%这样的t.tag更好。如果你有更多的搜索关键字,你可以使用

WHERE t.tag = '$searchs[0]' OR t.tag = '$searchs[1]'
或者你可以在文章标题中搜索

WHERE t.tag = '$searchs[0]' OR p.post_title = '$searchs[0]'

是的,这就是表联接存在的原因。您应该只选择与正在搜索的标记有联接的表。是否使用?而不是:tagand,其中t=f,其中t=d,但其中t=f或t=d@ezw我没有得到所有的字母以及它们的来源,我们基本上是告诉MySQL检索表POST,但我们将在这个查询语句中将其命名为P。。。因此,从帖子中选择*作为p搜索可以有多个标签,例如,他们可能会搜索car,blue,甚至car,blue,cheap,used,这会支持吗?另外,“posts p”中的p是什么,从哪里得到p这里的p与我的解决方案中的p相同。只是引用它设置为表示的表的查询的名称此查询与我的查询相同。。。只需根据需要添加尽可能多的WHERE子句。如果你要有一个动态的数量,那么你就必须动态地构建你的WHERE query我把它作为一个?或者我应该使用数组来替换它还是什么?我使用的是PDO我在我的主要问题中添加了my query方法,当使用thisUpdate时页面不会加载你的PHP实现query@Dan看看我的解决方案,这就是您调用查询的方式吗?
WHERE t.tag = '$searchs[0]' OR p.post_title = '$searchs[0]'
$sql = "SELECT * FROM posts AS P
            INNER JOIN post_tags AS PT
                ON PT.postid = P.id
            INNER JOIN tags AS T
                ON PT.tag = T.tag
        WHERE " . str_repeat(" T.tag = ? AND", count($searchs));

// The actual SQL you will be using. We are removing the last ' AND' from the sql
$sql = substr($sql, 0, -4);

// The correct way
$posts = DB::query($sql, $searchs);