我有这个代码可以返回我想要的结果:
SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') AS result FROM client_detail
结果如下:
#1 James Hadley (OpenBill)
#2 Lucinda Hadley (Make a Squish)
但是当使用LIKE尝试搜索相同的字符串时(我想在上面的结果中的任何地方搜索变量字符串),我没有输出也没有错误:
SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') AS result FROM client_detail WHERE CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') LIKE '%jam%' ORDER BY id ASC
我使用LIKE操作数是对的,还是有更好/正确的搜索结果?
答案 0 :(得分:1)
MySQL的CONCAT
语句将使用系统默认值进行排序。如果您的表定义为 UTF-8 ,但您的系统是 latin1 ,那么您的LIKE
语句可能会选择区分大小写的排序规则。
使用LOWER
强制不区分大小写的匹配
(使用HAVING
利用您的别名result
):
SELECT CONCAT('#',id,' ',firstname,' ',lastname,' (', company, ')') AS result
FROM client_detail
HAVING LOWER(result) LIKE '%jam%'
ORDER BY id ASC
或使用COLLATION(取决于您的系统)
...
HAVING result LIKE '%jam%' COLLATE latin1_general_ci
...
答案 1 :(得分:0)
而不是转换大小写,这是一项昂贵的操作,而不是强制使用不区分大小写的排序规则:
SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
AS result
FROM client_detail
WHERE CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
LIKE '%jam%' COLLATE utf8_general_ci
ORDER BY id ASC
但是,这仍然非常昂贵,因为它要求对表中的每个记录执行连接和搜索:索引是无用的。
也许可以重新调整查询以更好地利用索引(如果存在):
SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
AS result
FROM client_detail
WHERE firstname LIKE 'jam%' COLLATE utf8_general_ci
OR lastname LIKE 'jam%' COLLATE utf8_general_ci
OR company LIKE 'jam%' COLLATE utf8_general_ci
ORDER BY id ASC
虽然此查询仅在每个字段的开头搜索'jam'
,而不是在其中包含某些子字符串。