我正在尝试为内部使用编写一个小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%'";
但这不能正常工作,因为那里也可能有其他字母,这意味着选择无效。
此类查询是否可行,如果是,我该如何进行此类查询?
答案 0 :(得分:1)
您可以使用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预处理以获取所需的查询,仅适用于同一个字母的多个出现。
答案 1 :(得分:0)
MySQL有一个名为 RegExP 的功能。因此,理论上,您可以使用正则表达式查询和过滤元素。
$query = "SELECT word FROM words WHERE word REGEXP '^[dulco]{5}$'";
唯一的问题是你应该考虑这个查询有多贵。