Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在数据库中搜索包含所有指定字符但不包含其他字符的单元格_Php_Mysql_Sql - Fatal编程技术网

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

Php 在数据库中搜索包含所有指定字符但不包含其他字符的单元格,php,mysql,sql,Php,Mysql,Sql,我正在尝试编写一个供内部使用的小API,它基本上会在表列中搜索包含指定字母的所有结果,但会忽略包含比指定字母更多字母的单元格 例如,假设我有以下行: | id | word | | 1 | cloud | | 2 | could | | 3 | cloudy | 我的用户输入字符串“dulco”。在本例中,我们在数据库中搜索一个单元格,该单元格包含提供的所有字母,但不包含额外字母。所以每个单词都是正匹配,除了“cloudy”,因为它有一个额外的字母。现在想象一下,在更大的范围内,

我正在尝试编写一个供内部使用的小API,它基本上会在表列中搜索包含指定字母的所有结果,但会忽略包含比指定字母更多字母的单元格

例如,假设我有以下行:

| id | word   |
| 1  | cloud  |
| 2  | could  |
| 3  | cloudy |
我的用户输入字符串“dulco”。在本例中,我们在数据库中搜索一个单元格,该单元格包含提供的所有字母,但不包含额外字母。所以每个单词都是正匹配,除了“cloudy”,因为它有一个额外的字母。现在想象一下,在更大的范围内,有超过10万行

我已经做了一些搜索,试图找出如何做到这一点,但我无法找出正确的搜索词,因此我无法找出如何进行搜索。我想到了一个类似的条款:

$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}$'"; 

唯一的问题是你应该考虑这个查询有多昂贵。

这对我很有效,也很快。我所要做的就是做一个小小的foreach循环,为我生成查询。我刚刚发现了一个错误,它不能像预期的那样对包含多个单个字母的单词起作用。例如,单词“yell”。这允许查询返回在中有1个额外字符的单词them@GrumpyCrouton哼。。有趣。你找到解决办法了吗?我将搜索其他解决方案。我还没有找到其他解决方案。我目前有一种解决办法,用PHP循环遍历结果集,检查是否有外来字母。@GrumpyCrouton我已经更新了anwser。你能检查一下它是否能为你提供解决方案吗?@GrumpyCrouton正则表达式是关键。前一个是不正确的。试试这个新方法。我认为这个表达式比为字符串进行拆分的复杂查询更容易构建。我对正则表达式很在行。是的,我相信这种方法可能会奏效,问题是哪种方法更快。另一个答案给了我一个很快的结果,我将很快用正则表达式进行测试。这种方法很有效,但不完全有效,原因与以前相同。正则表达式检查是否存在任何字符,并返回至少包含1个字母的所有5个字母单词。例如,搜索单词“able”应该会得到响应:
[“able”、“albe”、“bael”、“bale”、“blae”]
,但在正则表达式中返回:
[“abba”、“abbe”、“able”、“alae”、“alae”、“alee”、“baal”、“baba”、“babe”、“bael”、“bale”、“ball”、“bell”、“blab”、“blee”、“blee”、“blee”、“leal”]