字符串模式匹配MySQL

字符串模式匹配MySQL,mysql,sql,regex,pattern-matching,Mysql,Sql,Regex,Pattern Matching,我试图找出在这种情况下查询MySQL数据库的最佳方法。让我们假设我有一个为用户提供个人信息的表。我要查询的字段是描述 栏目内容: [1] John Loves to play music [2] John hates music [3] David enjoys listening to music [4] Michael enjoys dancing. 我有一个表单中的输入字段,用户将在其中输入“John music”,它将返回前两个结果 我当前正在使用此查询: SELECT * from

我试图找出在这种情况下查询MySQL数据库的最佳方法。让我们假设我有一个为用户提供个人信息的表。我要查询的字段是描述

栏目内容:

[1] John Loves to play music
[2] John hates music
[3] David enjoys listening to music
[4] Michael enjoys dancing.
我有一个表单中的输入字段,用户将在其中输入“John music”,它将返回前两个结果

我当前正在使用此查询:

SELECT * from TABLE WHERE description LIKE '%$input_field%'
这显然对我不起作用,因为它只会返回字符串中包含“John music”的结果

我怎样才能实现我想要的

更新:

第二个场景是如何获得包含John或Music的所有结果。这将返回前三个结果


如何才能做到这一点?

要获得最大的灵活性,您应该查看。但是,如果您想要基本的SQL答案

如果你想找到约翰出现在音乐之前的地方

WHERE description LIKE '%john%music%'  # (i.e. change the values of your parameter)
如果要查找包含John和Music(按任意顺序)的事件

如果要查找包含John或music的事件

WHERE description LIKE '%john%' OR description like '%music%'
您可以使用以下方法进行操作:

在这里,您不需要将较大的输入字符串拆分为一个数组来与每个单词进行比较

请参考以下示例编写自己的示例:

我想向你解释一下;但我建议你也去看看

让我们看看示例表:

mysql> select * from articles;
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial   | DBMS stands for DataBase ...             |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
+----+-----------------------+------------------------------------------+

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('"database comparison"' IN BOOLEAN MODE);

+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
当引用以下词语时,顺序很重要:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('"comparison database"' IN BOOLEAN MODE);

Empty set (0.01 sec)
当我们删除引号时,它将搜索包含“数据库”或“比较”字样的行:

现在秩序已经不重要了:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('comparison database' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+
如果我们想要获取包含单词“PostgreSQL”或短语“database comparison”的行,我们应该使用以下请求:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('PostgreSQL "database comparison"' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+


确保您正在搜索的单词不在中,并且被忽略

您可以用
%
替换空格@sgeddes该查询是什么样子的?该查询看起来是一样的,除了您已经用
%
替换了所有空格的部分。这可以工作,但我只有一个输入字段。我必须将输入字符串分解成一个数组,然后执行此操作?如果您想使用第二个或第三个示例,可以。如果你想使用第一个,你必须在输入前修改输入字段的值。这对我来说非常有效。感谢您的详细解释:)如果我想在同一句话中包含带有“数据库”和“比较”字样的结果,该怎么办。我该怎么做呢?
mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('comparison database' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+
mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('PostgreSQL "database comparison"' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+