Php 查找具有多个标记的帖子
我正在搜索带有多个标签的帖子,并且已经找到了下面的代码,是否有更好的方法来实现这一点,或者这样可以吗 我的MySQL数据库有三个表post、tags和post\U tags 帖子:id | body 标记:标记|模式 post|标记:POSTD|标记 每个hvPost上的每个标记都有自己的列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);
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);