2

我有这段代码返回我想要的结果:

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 操作数是正确的,还是有更好/正确的搜索结果的方法?

4

2 回答 2

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
...
于 2012-10-12T17:31:16.673 回答
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'在每个字段的开头进行搜索,而不是其中的某个子字符串。

于 2012-10-12T17:42:52.387 回答