Поиск поста с несколькими тегами

0

Я ищу сообщения с несколькими тегами и придумал следующий код, есть ли лучший способ сделать это или это прекрасно?

В моей базе данных MySQL есть три таблицы, теги и теги post_tags

  • Сообщения: id | body
  • теги: тег | режим
  • post_tags: postid | тег

(Каждый тег на eachvpost получает свой собственный столбец)

     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;
    }
}
  • 0
    Да, именно поэтому существуют таблицы JOIN. dev.mysql.com/doc/refman/5.7/en/join.html вы должны выбирать только те таблицы, которые имеют соединение с тегом, который вы ищете.
  • 0
    Использовать ? вместо :tag
Показать ещё 11 комментариев
Теги:

2 ответа

1
Лучший ответ
$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);
  • 0
    Я оставлю это как? или я предполагаю использовать массив, чтобы заменить его или что-то?
  • 0
    Я использую PDO. Я добавил метод запроса в свой основной вопрос, при этом страница не загружается.
Показать ещё 2 комментария
0

Не могли бы вы показать свои столы. Или вы можете добавить корабль отношения в свою таблицу и использовать запрос 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]' 

Я думаю, что t.tag, как% $ searchs [0]%, лучше. и если у вас больше ключевых слов, которые вы можете использовать

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

Или вы можете искать в заголовке сообщения

WHERE t.tag = '$searchs[0]' OR p.post_title = '$searchs[0]'
  • 0
    лол мы ответили одновременно
  • 0
    Поиск может иметь более одного тега, например, они могут искать «автомобиль, синий» или даже «автомобиль, синий, дешевый, подержанный». Будет ли это поддерживать? Кроме того, что р в «сообщениях р», где вы получаете р
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню