Я настраиваю API для ввода типа ввода, который возвращает пользователей по имени и выбрал полный текстовый поиск MySQL, а не объединяет первую, среднюю и фамилию, чтобы пользователь мог больше гибкости при вводе имен, не беспокоясь о правильном порядке.MySQL Полный текст Поиск в подзапросе, не возвращая результатов
E.g. и «Carolina Del», «Delgado Caro» и т. д. будут соответствовать пользователю с соответствующими значениями в таблице user_names first_name = «Carolina», middle_name = «», last_name = «Delgado».
По какой-то причине я получаю нулевые результаты при использовании полнотекстового поиска после ограничения user/user_names, но я получаю правильные результаты при использовании LIKE.
Следующая дает 0 результаты
SELECT count(*) FROM `users`
WHERE (select count(*) from `user_names`
WHERE `user_names`.`user_id` = `users`.`id`
AND MATCH(first_name, middle_name, last_name)
AGAINST ('+carolina' IN BOOLEAN MODE)
) >= 1;
При использовании LIKE мы получаем 47 результатов
SELECT count(*) FROM `users`
WHERE (select count(*) FROM `user_names`
WHERE `user_names`.`user_id` = `users`.`id`
AND `first_name` LIKE "%carolina%")
>= 1;
И показать, что полный текст индексы работают правильно, вот запрос непосредственно на таблица имен пользователей, которая также дает 47 результатов
SELECT count(*) FROM `user_names`
WHERE MATCH(first_name, middle_name, last_name)
AGAINST ('+carolina' IN BOOLEAN MODE);
Для чего это стоит, я используя это в области построителя запросов Laravel, но поскольку SQL (выше), который он производит, не работает, мне нужно сначала понять, почему.
public function scopeForContactName($query, $name)
{
return $query->whereHas('contact.name', function ($query) use ($name) {
$query->where(function ($q) use ($name) {
$q->whereRaw("MATCH(first_name, middle_name, last_name) AGAINST (? IN BOOLEAN MODE)", [$name]);
});
});
}
Поскольку 'FULLTEXT' не имеет понятия' ASC' или 'DESC', я удивлен, что это имело какое-либо значение. –