mysql搜索's'结尾应该返回相同而没有's'结尾

时间:2012-02-29 09:46:37

标签: mysql full-text-search search-engine

我想在mysql中使用MATCH进行搜索。

我有1个表包含“name”和“category”字段。 “类别”字段包含书籍,书籍,书籍。

我想要的是,当我在类别字段中搜索“book”或“books”时,它应该给我3行。

任何人都可以帮我这个吗?

感谢

我需要澄清这个问题,实际上我有一个有搜索字段的网站。当用户在其上输入内容时,我的网站应该在类别字段中搜索。真正的问题是,有时用户输入“书”,有时“书”,有时“车”,有时“车”。这个词后面的这个词让我很头疼,我知道用户真正想要的是找到所有与书或车相关的东西,那么,我该怎么办,我应该去掉每一个“s”字母?或者有更好的解决方案吗?

阿里

4 个答案:

答案 0 :(得分:0)

select *
from table
where category LIKE '%book%'

答案 1 :(得分:0)

将用户输入修剪为可接受的长度并尝试此查询

  $userInput = substr($input, 0, 4);

  select * from table where category like "%$userInput%"

答案 2 :(得分:0)

例如,如果从PHP运行查询,则可以在那里准备查询,然后使用简单的正则表达式:

<?php

$term = 'book';

if(substr($term,-1) == 's') { //if term ends in an s
  $term = substr($term,0,-1); //the word without the s
}

//TODO: escape $term to prevent SQL injection

$query = "
  SELECT * FROM table
  WHERE category REGEXP '{$term}s?' // s? matches zero or one 's' character
";

答案 3 :(得分:0)

使用MATCH()搜索需要列类别的全文索引,这可能有点过分。

如果你真的只想要这两种情况,你可以写

select * from table where
category = 'book' or category = 'books'

对于Oddant的回答,你也可能得到像'probookcover'或其他任何结果。

如果您希望它不区分大小写,您有多种选择。

select * from table where
lower(category) = 'book' or lower(category) = 'books'

select * from table where
category like 'book' or category like 'books'

或者您也可以

select * from table where
category like 'book%'

它会为您提供以书籍开头的所有列,但您也可能会获得“bookcover”。

编辑:考虑您的评论:

就像我说的那样,match()是矫枉过正的,所以我会这样做:

select * from table where
category = whatYourUserEnters OR category = substring(whatYourUserEnters, 1, length(whatYourUserEnters) - 1)