Найти сообщение с несколькими тегами [дубликаты]

0

Я работаю над проектом, где проекты имеют теги, которые сохраняются как "компьютер, окна". Я бы так хотел, чтобы, если пользователь набирает "#Windows #Computer", он найдет все сообщения, у которых есть как компьютер, так и окна

Я попробовал query('SELECT * FROM posts WHERE FIND_IN_SET(:tags, tags)', array(':tags' => $query)) и я задал запрос в $query = "computer,windows"; который возвращает 0 результатов, хотя у меня есть один.

Чтобы получить его из списка хэштегов в список, я думал удалить пробелы и заменить "#" на ",", поэтому я могу иметь "компьютер, окна",

Во время поиска я нашел другие вопросы, но они, похоже, не поддерживали то, что мне нужно, так как пользователи могут вводить любое количество тегов, которые хотят, чтобы другие, казалось, хотели установить количество тегов

  • 2
    Создайте правильную реляционную таблицу, которая связывает теги с записями, и это тривиально. Если вы используете значение, разделенное запятыми, вы нарушаете правило нормализации базы данных Zero, One или Infinity .
  • 0
    Другое предложение - это несколько ключевых слов FIND_IN_SET для каждого поискового запроса.
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ

Сделайте это так: (я сделаю это с PDO)

// create a array of tags :
$arrayOfTags = [
    'computer',
    'windows',
    'another',
];
$query = 'SELECT * FROM posts WHERE ';

// as much tags add ? to query 
$first = true;
for($i = 0; $i < count($arrayOfTags); ++$i) {
    if($first == true){
        $query .= "tags LIKE ? ";
    }else{
        $query .= "AND tags LIKE ? ";
    }
    $first = false;
}


// ad '%' to the beginning and the end of each tag name 
$arrayOfTags = array_map(function($value){
    return '%'.$value.'%';
} , $arrayOfTags);

// prepare and execute the query 
$stmt = $conn->prepare($query ); 
$stmt->execute($arrayOfTags); 
//fetch the result

Обозначение кода:

  1. Прежде всего, мы сохраняем все теги в массиве.
  2. Далее, для каждого тега мы добавляем условие запроса (например, условие)
  3. Затем мы связываем все теги в качестве параметра запроса.
  4. Получаем результат
  • 0
    Это дало мне идею создать этот DB::query('SELECT * FROM posts WHERE FIND_IN_SET(:tags , tags) AND FIND_IN_SET(:tag2 , tags)', array(':tags' => 'windows', ':tag2' => 'computer')) но я не знаю, как заставить его поддерживать столько тегов, сколько они набирают
  • 0
    Почему бы вам не сделать цикл, подобный приведенному выше коду. и добавить к нему FIND_IN_SET(:tag2 , tags) столько же, сколько тегов?
Показать ещё 9 комментариев

Ещё вопросы

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