簡體   English   中英

查找帶有多個標簽的帖子

[英]Finding post with multiple tags

我正在搜索帶有多個標簽的帖子,並提出了以下代碼,是否有更好的方法可以做到這一點?

我的MySQL數據庫具有三個表post,tag和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;
    }
}
$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM