我正在尝试为内部使用编写一个小API,它基本上在我的表列中搜索包含指定字母的所有结果,但忽略包含多于指定字母的单元格。
例如,假设我有以下行:
| id | word |
| 1 | cloud |
| 2 | could |
| 3 | cloudy |
我的用户输入字符串“dulco”。在此示例中,我们在数据库中搜索包含所有提供的字母的单元格,但没有额外的字母。所以每个单词都是积极匹配,除了“阴天”,因为它有一个额外的字母。现在想象一下这个规模要大得多,其中有超过10万行。
我已经做了一些搜索试图找出如何做到这一点,但我无法弄清楚正确的搜索条件,因此我无法弄清楚如何进行搜索。我想到像LIKE子句这样的东西:
$query = "SELECT word FROM words WHERE word LIKE '%d%u%l%c%o%'";
但这不能正常工作,因为那里也可能有其他字母,这意味着选择无效。
这种类型的查询是否可行,如果是这样,我该如何进行这样的查询?
你可以尝试使用INSTR
和LENGTH
的组合:
SELECT word FROM words
WHERE INSTR(word,"d")
AND INSTR(word,"u")
AND INSTR(word,"l")
AND INSTR(word,"c")
AND INSTR(word,"o")
AND LENGTH(word)=5;
其中5是输入字符串的长度。
产出:
+-------+
| word |
+-------+
| cloud |
| could |
+-------+
编辑同一个字母的多个出现:
SELECT word FROM words
WHERE LOCATE("y",word)
AND LOCATE("e",word)
AND LOCATE("l",word)
AND LOCATE("l",word, LOCATE("l",word)+1)
AND LENGTH(word)=4;
所以,如果表包含yell
和yella
,它将只返回yell
。
这必须由PHP预处理以获取所需的查询,仅适用于同一个字母的多个出现。
MySQL有一个名为RegExP的函数。因此,理论上,您可以使用正则表达式查询和过滤元素。
$query = "SELECT word FROM words WHERE word REGEXP '^[dulco]{5}$'";
唯一的问题是你应该考虑这个查询的成本。