我正在为我的输入输入设置API,它按名称返回用户并选择了MySQL全文搜索,而不是连接第一个,中间名和姓,这样用户在输入名称时可以更灵活,而不用担心正确的顺序。
E.g。 “Carolina Del”,“Delgado Caro”等都会将用户与first_name =“Carolina”,middle_name =“”,last_name =“Delgado”的user_names表中的相应值进行匹配。
出于某种原因,在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 :(得分: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
但无论如何,对我有用!
答案 1 :(得分: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
表中,而不是单独的表格对我来说更有意义。