php - 关于搜索查询
问题描述
我是网络开发的新手。我有一个关于搜索结果的任务。
如果有人在我的网站上搜索“God is Great with us”,如果此字符串完全匹配,我希望结果首先显示“God is Great with us”,然后显示“god”相关名称产品(如果有),然后显示“great”相关名称产品(如果有),然后“与”相关名称产品(如果有)
我们必须丢弃少于 2 个字符。
我有 laravel 5.5 和 phpmyadmin pdo
我尝试了什么:
$search="God is Great with us"
$multiSearch = explode(" ", $search);
$multiSearch1 = [];
foreach ($multiSearch as $work) {
if (strlen($work) <= 2) {
continue;
} else {
$multiSearch1[] = $work;
}
}
array_unshift($multiSearch1, $search);
foreach ($multiSearch1 as $term) {
$query->orWhere('name', 'like', '%' . strtoupper($term) . '%');
}
return $query;
但我的结果没有按正确的顺序显示
使用“strtoupper 函数”,因为它的名称以大写形式保存
解决方案
如果我理解您的问题,那么问题是您想从整个短语开始对结果进行排名。问题是 MySQL 不会以任何保证的顺序返回结果。那是...
SELECT last_name FROM customers WHERE last_name LIKE 'A%' OR last_name LIKE 'B%' OR last_name LIKE 'C%';
...可能会回来...
last_name
---------
Babu
Agarwal
Chabra
要获得您想要的顺序,您需要使用一系列 UNION 查询来确保正确的顺序,如下所示:
$words = explode(" ", $search);
$multiSearch=[];
foreach($words as $word){
if(strlen($word)<=2){
continue;
} else {
$multiSearch[]=$word;
}
}
// Start the query with the whole search term
$query = DB:table('products')
->select(DB:raw('1 as displayOrder, name')
->where('name', 'like', '%' . strtoupper($search) . '%');
$displayOrder=2;
foreach ($multiSearch as $term){
// Make a new query for each word, each with a greater display order
$wordQuery = DB:table('products')
->select(DB:raw($displayOrder . ' as displayOrder, name');
// Add this word's query to the main query
$query->union('$wordQuery');
$displayOrder++;
}
// This query will now be a union of each search, ordered as you wish
$query->orderBy(displayOrder', 'name');
推荐阅读
- c++ - 对这两个赋值运算符之间的区别感到困惑
- javascript - 如何在反应应用程序中从本地浏览器存储中存储和检索字符串?
- sql - 为单个用户选择不同的 MAX NoteID
- spring - 具有多个客户端的 Spring webflux 超时
- excel - 为每个打开的工作簿执行功能
- arrays - 如何读取 Json 中的特定列表
- python - 如何列出模块所依赖的用户创建的 python 文件?
- typescript - 除了 tsc,还有其他 TypeScript 工具吗?
- google-sheets - SUBSTITUTE 错误:“超过 50000 个字符的限制”——当文本字符串只有 4000 个字符时
- java - 检测是否已生成文件并将文件从一个目录移动到另一个目录