MySQL在任何位置查找包含所有字母的单词
使用以下查询MySQL在任何位置查找包含所有字母的单词,mysql,regex,Mysql,Regex,使用以下查询 SELECT * FROM words WHERE word REGEXP '(ord)' 这将返回诸如ford,lord,word 我如何将这些字母出现但顺序不同的单词包括在内 例如adore,door,random 编辑: 让它工作起来 SELECT word, ( IF(LOCATE('o', word) > 0, 1, 0) + IF(LOCATE('r', word) > 0, 1, 0) + IF(LOCATE('z',
SELECT * FROM words WHERE word REGEXP '(ord)'
- 这将返回诸如
,ford
,lord
word
- 例如
,adore
,door
random
SELECT word, (
IF(LOCATE('o', word) > 0, 1, 0) +
IF(LOCATE('r', word) > 0, 1, 0) +
IF(LOCATE('z', word) > 0, 1, 0) +
IF(LOCATE('a', word) > 0, 1, 0) +
IF(LOCATE('d', word) > 0, 1, 0)) AS chars_present
from words
HAVING chars_present = 5
现在,我如何两次查询包含字母
r
的单词呢?在mysql中使用正则表达式要求所有三个字符都出现在任何位置都会很难看,您最好使用以下方法:
SELECT (
IF(LOCATE('o', words) > 0, 1, 0) +
IF(LOCATE('r', words) > 0, 1, 0) +
IF(LOCATE('d', words) > 0, 1, 0)) AS chars_present
...
HAVING chars_present = 3
在mysql中使用正则表达式要求所有三个字符都出现在任何位置都是很难看的,您最好使用以下内容:
SELECT (
IF(LOCATE('o', words) > 0, 1, 0) +
IF(LOCATE('r', words) > 0, 1, 0) +
IF(LOCATE('d', words) > 0, 1, 0)) AS chars_present
...
HAVING chars_present = 3
对每个字母重复这个规则
SELECT * FROM words WHERE word REGEXP 'o' AND word REGEXP 'r' AND word REGEXP 'd'
规则出现的顺序并不重要。只需对每个字母重复规则即可
SELECT * FROM words WHERE word REGEXP 'o' AND word REGEXP 'r' AND word REGEXP 'd'
规则出现的顺序并不重要。这可能是最快的:
SELECT *
FROM words
WHERE LOCATE('o', word)
AND LOCATE('r', word)
AND LOCATE('d', word);
mysql> SELECT city, state FROM us
WHERE locate('o', city) AND locate('r', city) AND locate('d', city)
LIMIT 11;
+---------------+-------+
| city | state |
+---------------+-------+
| Irondale | AL |
| Oxford | AL |
| El Dorado | AR |
| Paragould | AR |
| Sherwood | AR |
| Goodyear | AZ |
| Safford | AZ |
| Alondra Park | CA |
| Anderson | CA |
| Arroyo Grande | CA |
| Atascadero | CA |
+---------------+-------+
11 rows in set (0.00 sec)
如果您需要两个r
,那么对它们的测试将是word REGEXP'r.*r'
:
mysql> SELECT city, state FROM us
-> WHERE locate('o', city) AND city REGEXP 'r.*r' AND locate('d', city)
-> LIMIT 5;
+--------------------+-------+
| city | state |
+--------------------+-------+
| Alondra Park | CA |
| Arroyo Grande | CA |
| Corte Madera | CA |
| Desert Hot Springs | CA |
| Garden Grove | CA |
+--------------------+-------+
这可能是最快的:
SELECT *
FROM words
WHERE LOCATE('o', word)
AND LOCATE('r', word)
AND LOCATE('d', word);
mysql> SELECT city, state FROM us
WHERE locate('o', city) AND locate('r', city) AND locate('d', city)
LIMIT 11;
+---------------+-------+
| city | state |
+---------------+-------+
| Irondale | AL |
| Oxford | AL |
| El Dorado | AR |
| Paragould | AR |
| Sherwood | AR |
| Goodyear | AZ |
| Safford | AZ |
| Alondra Park | CA |
| Anderson | CA |
| Arroyo Grande | CA |
| Atascadero | CA |
+---------------+-------+
11 rows in set (0.00 sec)
如果您需要两个r
,那么对它们的测试将是word REGEXP'r.*r'
:
mysql> SELECT city, state FROM us
-> WHERE locate('o', city) AND city REGEXP 'r.*r' AND locate('d', city)
-> LIMIT 5;
+--------------------+-------+
| city | state |
+--------------------+-------+
| Alondra Park | CA |
| Arroyo Grande | CA |
| Corte Madera | CA |
| Desert Hot Springs | CA |
| Garden Grove | CA |
+--------------------+-------+
[ord]{3}
。。。。。但是这会发现rod
,而不是orsd
,因为s
不是类的一部分,{3}
要求这三个字符是连续的。你想用它解决什么问题?似乎是一个非常奇怪的要求,可能有一个更好的方法可用。我对任何方法都很好。。。我的目标是从包含一些字母的表中检索单词,顺序可以任意。所有字母都必须出现。[ord]{3}
。。。。。但是这会发现rod
,而不是orsd
,因为s
不是类的一部分,{3}
要求这三个字符是连续的。你想用它解决什么问题?似乎是一个非常奇怪的要求,可能有一个更好的方法可用。我对任何方法都很好。。。我的目标是从包含一些字母的表中检索单词,顺序可以任意。所有字母都必须出现。我对你的询问有点不知所措。我的表格是words
,列是word
。完整的语法是什么?不,它不是复杂的语法,只是显示关键部分-检查每个特定字符是否存在,并且只允许所有三个字符都存在的记录。下面ricKJames的版本更容易理解,但我的版本允许您对每个字符的数量设置限制(例如3个o、2个d和1个r)。好的,我想我已经掌握了语法。如何设置限制?我试过IF(LOCATE('r',words)>0,2,0)
但这似乎不起作用。你将单个IF()语句分离成它们自己的别名,然后让r_count=X,o_count=Z,等等。
你介意用一个例子更新你的答案吗?我对你的查询有点不知所措。我的表格是words
,列是word
。完整的语法是什么?不,它不是复杂的语法,只是显示关键部分-检查每个特定字符是否存在,并且只允许所有三个字符都存在的记录。下面ricKJames的版本更容易理解,但我的版本允许您对每个字符的数量设置限制(例如3个o、2个d和1个r)。好的,我想我已经掌握了语法。如何设置限制?我尝试过IF(LOCATE('r',words)>0,2,0)
,但这似乎不起作用。您将各个IF()语句分离为它们自己的别名,然后使用r_count=X,o_count=Z等。
您介意用一个例子更新您的答案吗?(不需要+
)(不需要+
)+1用于完整查询。如果我想输入同一个字母两次呢?例如,包含o,r,r,d
的单词。谢谢。locate
应该比REGEXP
快吗?我没有任何基准测试,但我希望locate
比REGEXP
快得多。但是,如果没有regexp
,我想不出一种方法可以轻松快速地执行2r
。真正的性能影响是必须读取每一行(没有索引是有帮助的)并多次扫描列。此外,类似于
可能会更快:城市类似于“%o%”
+1以完成查询。如果我想输入同一个字母两次呢?例如,包含o,r,r,d
的单词。谢谢。locate
应该比REGEXP
快吗?我没有任何基准测试,但我希望locate
比REGEXP
快得多。但是,如果没有regexp
,我想不出一种方法可以轻松快速地执行2r
。真正的性能影响是必须读取每一行(没有索引是有帮助的)并多次扫描列。此外,类似
可能会更快:城市类似“%o%”
。