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

时间:2018-02-06 17:08:17

标签: php mysql sql

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

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

此类查询是否可行,如果是,我该如何进行此类查询?

2 个答案:

答案 0 :(得分: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预处理以获取所需的查询,仅适用于同一个字母的多个出现。

答案 1 :(得分:0)

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

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

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