【发布时间】:2018-02-26 04:30:00
【问题描述】:
我正在搜索具有多个标签的帖子并想出了以下代码,有没有更好的方法来做到这一点或者这样可以吗?
我的 MySQL 数据库有三个表 post、tags 和 post_tags
- 帖子:id|body
- 标签:标签|模式
- post_tags: postid|标签
(每个vpost上的每个标签都有自己的列)
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;
}
我主要担心的是如果一个标签有数百万个帖子,它会不会循环数百万个听起来效率不高的东西。
编辑:
if(isset($_GET["query"])){
$query = trim($_GET['query']);
$searchs = explode(",", $query);
$dataquery = "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";
foreach($searchs as $search){
$dataquery .= " WHERE T.tag = :tag";
}
$posts = DB::query($dataquery, array(':tag' => $searchs));
echo sizeof($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;
}
}
【问题讨论】:
-
是的,这就是表 JOIN 存在的原因。 dev.mysql.com/doc/refman/5.7/en/join.html 你应该只选择与你正在搜索的标签有连接的表。
-
使用
?而不是:tag -
不是
WHERE t = f WHERE t= d,而是WHERE t = f OR t = d -
@ezw 我没有得到所有的字母以及你从哪里得到它们
-
我们基本上是在告诉 MySQL 检索表
posts,但对于这个查询语句,我们将其命名为P...因此 SELECT * FROM posts ASP跨度>