在数据库中搜索包含所有指定字符但没有其他字符的单元格

问题描述 投票:1回答:2

我正在尝试为内部使用编写一个小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%'";

但这不能正常工作,因为那里也可能有其他字母,这意味着选择无效。

这种类型的查询是否可行,如果是这样,我该如何进行这样的查询?

php mysql sql
2个回答
1
投票

你可以尝试使用INSTRLENGTH的组合:

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;

所以,如果表包含yellyella,它将只返回yell

这必须由PHP预处理以获取所需的查询,仅适用于同一个字母的多个出现。


0
投票

MySQL有一个名为RegExP的函数。因此,理论上,您可以使用正则表达式查询和过滤元素。

$query = "SELECT word FROM words WHERE word REGEXP '^[dulco]{5}$'"; 

唯一的问题是你应该考虑这个查询的成本。

© www.soinside.com 2019 - 2024. All rights reserved.