MySQL,REGEXP - 查找仅包含以下确切字母的单词

时间:2015-12-30 00:07:30

标签: mysql regex

我有一定长度的英文单词数据库。例如,表us_6包含长度为6的英语单词。

现在,我想在表格中搜索仅包含特定字母的单词。例如,我想搜索包含字母vleoyl的单词。我使用REGEXP进行了搜索。这是我的疑问:

    SELECT word FROM us_6 WHERE
    word REGEXP 'v' AND
    word REGEXP 'l' AND
    word REGEXP 'e' AND
    word REGEXP 'o' AND
    word REGEXP 'y' AND
    word REGEXP 'l'

结果会返回正确的字词lovelyvolley,但它也会返回其他字词。这是查询的结果:

    lovely
    loveys
    overly
    volley

你能帮我解决这个问题吗?我只想要包含完全包含字母的单词。例如,vleoyl只应返回lovelyvolley

3 个答案:

答案 0 :(得分:4)

这里的问题是您要检查l两次是否存在。这跟......一样......"它包含l。是的,仍然包含l。"它没有检查其中两个。这是另一种选择......

SELECT word FROM us_6 WHERE
word REGEXP 'v' AND
word REGEXP 'l.*l' AND
word REGEXP 'e' AND
word REGEXP 'o' AND
word REGEXP 'y'

这应匹配包含v,两个leoy的所有字词。

因此,同一个字母的每个其他出现,只需在查询中添加另一个。*字母。例如,lullaby需要以下查询:

    SELECT word FROM us_7 WHERE
    word REGEXP 'l.*l.*l' AND
    word REGEXP 'u' AND
    word REGEXP 'a' AND
    word REGEXP 'b' AND
    word REGEXP 'y'

了解我如何添加3 *.l,因为l一词中出现了lullaby次。{/ p>

使用LIKE代替REGEXP也可以完成同样的事情。这是原始问题的等效查询...

SELECT word FROM us_6 WHERE
word LIKE '%v%' AND
word LIKE '%l%l%' AND
word LIKE '%e%' AND
word LIKE '%o%' AND
word LIKE '%y%'

答案 1 :(得分:2)

在盒子外面思考!

lovelyvolley存储为ellovy。也就是说,对字母进行排序,然后进行完全匹配。

构建一个映射表

ellovy -> lovely
ellovy -> volley
ellowy -> yellow
elorvy -> overly
elovsy -> loveys 

第一列上有非UNIQUE(非PRIMARY)键。 (可能第二列是PRIMARY KEY

不需要REGEXPOR等等。而且muuuuuch更快。此外,它可以是所有字长的单个表。

答案 2 :(得分:0)

我并不认真地提倡这个解决方案 - 相反,我会使用应用程序级代码来完成这项任务(例如一些PHP),为此必须有无数的教程 - 但只是为了好玩。 ..

SELECT * FROM strings;
+-----------+--------+
| string_id | string |
+-----------+--------+
|         2 | lovely |
|         3 | volley |
|         1 | yellow |
+-----------+--------+

3 rows in set (0.00 sec)SELECT DISTINCT CONCAT(a.x,b.x,c.x,d.x,e.x,f.x) needle
  FROM 
     ( SELECT 'v' x UNION ALL SELECT 'o' UNION ALL SELECT 'l' UNION ALL SELECT 'l' UNION ALL SELECT 'e' UNION ALL SELECT 'y') a
  JOIN
     ( SELECT 'v' x UNION ALL SELECT 'o' UNION ALL SELECT 'l' UNION ALL SELECT 'l' UNION ALL SELECT 'e' UNION ALL SELECT 'y') b
  JOIN
     ( SELECT 'v' x UNION ALL SELECT 'o' UNION ALL SELECT 'l' UNION ALL SELECT 'l' UNION ALL SELECT 'e' UNION ALL SELECT 'y') c
  JOIN
     ( SELECT 'v' x UNION ALL SELECT 'o' UNION ALL SELECT 'l' UNION ALL SELECT 'l' UNION ALL SELECT 'e' UNION ALL SELECT 'y') d
  JOIN
     ( SELECT 'v' x UNION ALL SELECT 'o' UNION ALL SELECT 'l' UNION ALL SELECT 'l' UNION ALL SELECT 'e' UNION ALL SELECT 'y') e
  JOIN
     ( SELECT 'v' x UNION ALL SELECT 'o' UNION ALL SELECT 'l' UNION ALL SELECT 'l' UNION ALL SELECT 'e' UNION ALL SELECT 'y') f
  JOIN strings s
    ON s.string = CONVERT(CONCAT(a.x,b.x,c.x,d.x,e.x,f.x) USING utf8) ;

+--------+
| needle |
+--------+
| lovely |
| volley |
+--------+