2017-02-12 14 views
0

Я настраиваю 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]); 
     }); 
    }); 
} 

ответ

0

Это было решено путем установки индексного хранилища как восходящего.

я ранее создания индексов, как так:

CREATE FULLTEXT INDEX full_text_index ON `user_names` (`first_name`, `middle_name`, `last_name`) 

Следующая скорректированный SQL исправлена ​​проблема:

CREATE FULLTEXT INDEX full_text_index ON `user_names` (`first_name` ASC, `middle_name` ASC, `last_name` ASC) 

Это, кажется, идти против документации MySQL, которая гласит:

Спецификация index_col_name может заканчиваться ASC или DESC. Эти ключевые слова разрешены для будущих расширений для указания восходящего или нисходящего значения индекса. В настоящее время они анализируются, но игнорируются; значения индекса всегда сохраняются в порядке возрастания. MySQL 5.7 Docs

Но все равно работает для меня!

+0

Поскольку 'FULLTEXT' не имеет понятия' ASC' или 'DESC', я удивлен, что это имело какое-либо значение. –

0

Первый запрос не имеет смысла. Подзапрос возвращает 1 строку - счетчик; внешний запрос должен видеть точно одну строку для подсчета.

Что вы получаете от этой формулировки?

SELECT count(*) 
    FROM `users` AS u 
    JOIN `user_names` AS un ON un.`user_id` = u.`id` 
    WHERE MATCH(un.first_name, un.middle_name, un.last_name) 
      AGAINST ('+carolina' IN BOOLEAN MODE); 

Это имеет смысл (для меня), чтобы поместить имена в users таблице, а не в отдельной таблице.