我有一定长度的英文单词数据库。例如,表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'
结果会返回正确的字词lovely
和volley
,但它也会返回其他字词。这是查询的结果:
lovely
loveys
overly
volley
你能帮我解决这个问题吗?我只想要包含完全包含字母的单词。例如,vleoyl
只应返回lovely
和volley
。
答案 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
,两个l
,e
,o
和y
的所有字词。
因此,同一个字母的每个其他出现,只需在查询中添加另一个。*字母。例如,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)
在盒子外面思考!
将lovely
和volley
存储为ellovy
。也就是说,对字母进行排序,然后进行完全匹配。
构建一个映射表
ellovy -> lovely
ellovy -> volley
ellowy -> yellow
elorvy -> overly
elovsy -> loveys
第一列上有非UNIQUE
(非PRIMARY
)键。 (可能第二列是PRIMARY KEY
。
不需要REGEXP
,OR
等等。而且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 |
+--------+