MySQL SELECT首字母顺序搜索

时间:2017-02-23 14:03:17

标签: php mysql regex match

示例字词

iknkr st nm krt prk
iknkr vhgr j k pth  
iknkr hkm st
iknkr sr vhgr j k pth

必填条件

现在,如果用户输入:ik s,查询将返回:

iknkr st nm krt prk 
iknkr sr vhgr j k pth

如果用户输入:i v,查询将返回:

iknkr vhgr j k pth

目前正在尝试:

SELECT `walpha` AS word, pageID AS id 
FROM `SX01` 
WHERE `table`= 'S01' 
  AND `walpha` like '" . $this->db->escape_like_str($searchVal['keyword']) . "%' 
LIMIT 100"

但使用此用户必须输入:iknkr s

获得结果

iknkr st nm krt prk 
iknkr sr vhgr j k pth

任何人都可以建议,这样做的正确方法是什么。

3 个答案:

答案 0 :(得分:3)

您可以从输入中构建regular expression,然后使用REGEXP让MySQL使用它。例如,您可以将ik s转换为^ik[a-z]* s,以匹配以ik开头的单词,后跟以s开头的单词...

SELECT words FROM tbl WHERE t.words REGEXP '^ik[a-z]* s';
  • ^表示我们必须从字符串的开头匹配
  • ik必须是前两个字符
  • [a-z]将匹配任何小写字母字符
  • *允许我们匹配前一个模式的零个或多个 - 即任何字符序列都可以跟ik
  • 然后必须有空格
  • s后跟s - 我们不关心接下来的内容。

您可以使用[a-z]*替换所有空格并使用^前缀

,从用户输入构建此模式

答案 1 :(得分:1)

如果我理解你的逻辑,你可以尝试这样的查询:

select `walpha` AS word, pageID AS id
from `SX01` 
where
  `table`= 'S01' 
  and `walpha` like concat(replace('" . $yoursearchval . "', ' ', '% '), '%') 
limit 100

例如:

concat(replace('i k', ' ', '% '), '%')

将成为:

i% k%

但如果您希望这些单词是连续的,那么您必须使用正则表达式:

where whalpa regexp concat('^', replace('i k', ' ', '[^[:space:]]+ '))

我将成为:

^i[^[:space:]]+ k
  • 字符串必须以i
  • 开头
  • 在我之后必须至少有一个非空格字符
  • 然后是一个空格
  • 然后一个k
  • 然后其他任何事情

答案 2 :(得分:0)

select id,title,upper(left(title,1)) AS FirstLetter from store order by title