[英]Finding post with multiple tags
我正在搜索帶有多個標簽的帖子,並提出了以下代碼,是否有更好的方法可以做到這一點?
我的MySQL數據庫具有三個表post,tag和post_tags
(每個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;
}
}
$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);
您能顯示您的桌子嗎? 或者,您可以在表中添加關系船並使用像這樣的查詢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]'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.