Я ищу сообщения с несколькими тегами и придумал следующий код, есть ли лучший способ сделать это или это прекрасно?
В моей базе данных MySQL есть три таблицы, теги и теги post_tags
(Каждый тег на 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;
}
}
$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]'
Я думаю, что 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]'
?
вместо:tag