【问题标题】:MySQL SELECT first letter of the words sequentially for searchingMySQL SELECT 单词的首字母顺序进行搜索
【发布时间】:2017-07-14 01:32:12
【问题描述】:

示例词:

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

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

【问题讨论】:

  • 你能解释一下逻辑吗?如果用户输入ik,您想要包含ik 或以ik 开头的单词?
  • ik开头,但搜索将从第一个单词开始,如果用户输入ik s vb n,那么它将匹配第一个单词的ik,第二个单词的s,@987654335 @ 来自第三个单词,n 来自第四个单词,并显示基于此的结果
  • 所以如果有两个词像ik s,第一个词需要以ik开头,第二个词需要s
  • @JuanCarlosOropeza OP 希望用户输入的每个字符串都与他的字符串中的一个词相匹配。所以“AA BB”意味着字符串中的第一个单词必须以 AA 开头,第二个单词必须以 BB 开头。这至少是我对这篇令人困惑的帖子的最佳猜测
  • 是的,这就是我想要的@LelioFaieta

标签: php mysql regex match


【解决方案1】:

您可以从输入构建一个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]* 并以 ^ 为前缀,从用户输入构建此模式

【讨论】:

  • 正则表达式对我来说很难。为什么您不必包含s* 来表示其他任何内容?
  • @JuanCarlosOropeza:* 符号表示 ik 之后的任何内容,[a-z] 表示它可以是任何字母字符。查询工作正常
  • s* 表示“零个或多个 s 字符”,这不是您想要的。您只想确保下一个工作以 s 开头,而不关心其余的。
  • @prakashtank 我理解第一个* 我的问题是为什么s 不需要*
  • 我可以使用您的建议解决问题 - "SELECT `walpha` AS word, `pageID` AS id FROM `SX01` WHERE `table`= 'S01' AND `walpha` regexp concat('^', replace('" . $this->db->escape_like_str($searchVal['keyword']) . "', ' ', '[a-z]* ')) LIMIT 100" +1 @PaulDixon
【解决方案2】:

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

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 k 将变为:

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

【讨论】:

  • 这将匹配 iknkr zzzz ssss 这可能不是 OP 想要的 - 它不能确保 second 单词将以 s 开头
  • @PaulDixon 是的,你是对的,我刚刚更新了我的答案,谢谢
  • 我正在将你的字符串拆分为rows,但小提琴不起作用:(
  • @JuanCarlosOropeza sqlfiddle 此刻低头......无论如何我在答案中包含了小提琴,第二部分,所以如果你愿意,你可以在自己的服务器上尝试
  • 是的,我把它移到了 rextester,但没有因为错字而工作。现在正在修复。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多