在谷歌搜索后,当在clause
中使用like
时,我找不到根据优先级排序数据的答案
我使用以下查询对数据进行排序和查看:
SELECT i.name,i.add_time,round(i.price),s.store_address
FROM store_items i,stores s
WHERE i.store_id = s.store_id
AND (lower(i.name) LIKE '%samsung glaxy%'
OR lower(i.name) LIKE '%samsung%'
OR lower(i.name) LIKE '%glaxy%')
ORDER BY i.price ASC LIMIT 0,25
如何首先将Samsung Galaxy第一个like
运算符的结果行排序为第一优先级,然后将Samsung和Galaxy的行排序为第二优先级?
请注意:
第一优先级意味着结果行应首先显示,第二优先级 我必须把它放在我的PHP函数中。 @10086’我无法将其放入 我的PHP代码是: 我在PHP代码中的SQL查询给了我以下错误: 您的SQL语法有错误;查看与您的MariaDB服务器版本对应的手册,了解在第1行的"lower(i.name)"附近使用的正确语法,如"%refreshed%"THEN 3 END ASC LIMIT 0,25PHP CODE
$sort = $_COOKIE['sort'];
$price_sort = $_COOKIE['price_sort'];
$currency_value = $_COOKIE['currency_value'];
if (!isset($_GET['number'])) {
$limit = 0;
}else{
$limit = filter_var($_GET['number'], FILTER_SANITIZE_NUMBER_INT);
}
$keyword_exp = explode(" ", $keyword); //separating keywords
$like = ""; //for use like clause for every keyword
$case = ""; // for priority selection case in query order
$case_inc = 2;
foreach ($keyword_exp as $value) {
$like .= "AND lower(i.name) like '%$value%'";
$case .= "WHEN lower(i.name) like '%$value%' THEN $case_inc";
$case_inc += 1;
}
//query performing to show result
$sql_query = "SELECT i.name 'title',i.add_time 'time',round(i.price) 'price',round(i.new_price) 'new_price',s.store_address 'address' FROM store_items i,stores s WHERE i.store_id = s.store_id $like ORDER BY CASE WHEN lower(i.name) LIKE '%$keyword%' THEN 1 $case END ASC LIMIT 0,25";
$query = mysql_query($sql_query) or die(mysql_error());
while ($row = mysql_fetch_array($query)) :
extract($row);
endwhile;
使用CASE WHEN
:
SELECT i.name,i.add_time,round(i.price),s.store_address
FROM store_items i,stores s
WHERE i.store_id = s.store_id
AND (lower(i.name) LIKE '%samsung glaxy%' OR lower(i.name) LIKE '%samsung%' OR lower(i.name) LIKE '%glaxy%')
ORDER BY
CASE WHEN lower(i.name) LIKE '%samsung glaxy%' THEN 1
WHEN lower(i.name) LIKE '%samsung%' THEN 2
WHEN lower(i.name) LIKE '%glaxy%' THEN 3
ELSE 4 END,
i.price ASC
LIMIT 0,25
您的查询不会像预期的那样快,因为:
- 当
LIKE
已经不区分大小写时,可以使用lower
函数。select 'a' LIKE 'A'
将返回true
- 在WHERE中使用列作为函数的参数会迫使服务器绕过其索引并处理该行:例如:
lower(i.name)
。一般情况下应避免出现这种情况
如果您有MySQL 5.6+,并且store_items.name
的类型为CHAR、VARCHAR或TEXT,则在name
列中添加FULLTEXTindex以优化其文本搜索。
ALTER TABLE store_items ADD FULLTEXT fulltext_name (name);
然后修改您的查询以使用MATCH...AGAINST
语法:
SELECT i.name,i.add_time,round(i.price),s.store_address
FROM store_items i JOIN stores s ON i.store_id = s.store_id
WHERE MATCH(i.name) AGAINST('samsung galaxy')
此搜索将返回具有两个单词samsung
和galaxy
中的至少一个单词的所有行。同时包含这两个单词的行在结果集中会更高。
来自文档:
MATCH()采用逗号分隔的列表来命名要已搜索。"反对"需要一个字符串来搜索指示执行的搜索类型的修饰符
全文索引只能与MyISAM表一起使用。(在MySQL 5.6中以及以上,它们也可以与InnoDB表一起使用。)全文索引只能为CHAR、VARCHAR或TEXT列创建