查询字段包含给定文本字符串的任何顺序的表

时间:2014-04-22 00:33:04

标签: php mysql sql regex database

我想按如下方式查询表:

我有一个名为“category”的字段,我的输入匹配包含N个单独的单词。我希望查询匹配包含所有N个单词的所有行,但是按任何顺序排列。

例如,如果字段类别包含“hello good morning world”,我的输入查询可以包含“hello morning”或“good”或“world hello”,并且所有内容都与查询匹配。

如何制定这样的SQL表达式?

如果查询可以不区分大小写,那也很好。

2 个答案:

答案 0 :(得分:2)

如果您使用的是MySQL,可以使用boolean fulltext search feature来实现此目的。您可以在每个术语的前面添加一个+,然后只返回包含所有术语的结果(按任何顺序)。您需要确保包含类别字段的列具有指定的全文索引才能使其生效。其他数据库引擎可能具有类似的功能因此,例如,假设在类别列上有全文索引,您可能会执行以下操作...

SELECT * FROM myTable WHERE MATCH (category) AGAINST ('+term1 +term2 +term3' IN BOOLEAN MODE);

我会避免使用“LIKE”运算符,因为其他人建议你不得不担心混合大写/小写的头痛问题,如果你有一个大型数据库在LIKE搜索词的前面使用%导致全表扫描而不是使用对性能而言可怕的索引。

答案 1 :(得分:0)

我没有编写将为您构建此查询的循环。这将完成工作,但效率很低。

SELECT * FROM table 
  WHERE (
    TOUPPER(category) LIKE '*HELLO*' AND
    TOUPPER(category) LIKE '*GOOD*' AND
    TOUPPER(category) LIKE '*MORNING*' AND
    TOUPPER(category) LIKE '*WORLD*'
    );

您还可以使用带有SQL的REGEX进行研究。