2

所以我有一个数据库和一个网页,我想在其中显示我的数据库搜索结果

我尝试了几种方法都可以工作,但它们对于我想要完成的事情是不完整的

我希望能够使用我的搜索文本中的一个或多个单词来搜索我的表格列 id、Id_Nombre、Pais、Estado、Ciudad、website。

此代码有效,但我必须准确输入区分大小写的单词:

$query = "SELECT * FROM Medios_table WHERE concat(id,Id_Nombre,Pais,Estado,Ciudad,website) LIKE '%$Busqueda%'";

所以结果我在我的搜索框中输入了一个像“人”这样的词,在我的数据库中,这个词在任何这些列中输入为“人”,它不会找到它。

我使用的第二个代码有效,但只使用一列

$query = "SELECT * FROM Medios_table WHERE UPPER(Id_Nombre) LIKE UPPER('%$Busqueda%')";

这段代码的结果很好,因为无论使用哪种情况,它都会找到它,但我需要将这种类型的搜索扩展到所有其他列,但到目前为止我使用的所有内容都不起作用。

我试过了:

 $query = "SELECT * FROM Medios_table WHERE UPPER(id,Id_Nombre,Pais,Estado,Ciudad,website) LIKE UPPER('%$Busqueda%')";

  $query = "SELECT * FROM Medios_table WHERE UPPER(concat(id,Id_Nombre,Pais,Estado,Ciudad,website)) LIKE UPPER('%$Busqueda%')";

  $query = "SELECT * FROM Medios_table WHERE concat(UPPER(id,Id_Nombre,Pais,Estado,Ciudad,website)) LIKE UPPER('%$Busqueda%')";

等任何帮助都非常感谢,谢谢。

4

3 回答 3

4

您是否尝试UPPER过每个列名?像这样:

$query = "SELECT * FROM Medios_table WHERE concat(UPPER(id),UPPER(Id_Nombre),UPPER(Pais),UPPER(Estado),UPPER(Ciudad),UPPER(website)) LIKE UPPER('%$Busqueda%')";
于 2012-10-22T20:19:24.310 回答
1

您的 upper(concat(...)) 版本应该可以工作。如果您对此有疑问,则可能只是一个错字,例如您遗漏了括号之类的东西。

你不能说 upper(x,y,z) 因为 upper 只接受一个参数。你必须先做concat,然后做upper,即upper(concat(x,y,z))。

也就是说,这个查询在大型数据库上会非常慢,因为 db 引擎必须读取表中的每条记录,然后逐个字符地搜索每条记录。如果桌子很小或者不经常这样做,那可能是可以接受的。如果表很大并且/或者这个查询会经常被执行,你真的需要一个完全不同的方法。

更新

如果您确实需要搜索字段中的任何文本,而您无法对正在搜索的文本或正在搜索的文本做出任何假设,那么您应该研究全文搜索。http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

如果您将一直进行此类搜索,您可能想要构建一个字典,即构建一个包含该单词出现的所有记录的所有单词的列表。我认为这基本上就是全文所做的,所以这可能会或可能不会为您带来任何好处。

但是,如果您有一些先见之明,也就是说,如果您不是真的要搜索出现在任意文本中的任意文本,则可以将要搜索的内容分解到单独的字段中。

举个简单的例子,假设您有一个包含客户全名的字段,例如“Fred Smith”、“Mary Jones”等。您想按姓氏搜索某人。你可以搜索

where full_name like '%Smith%'

但这需要读取表中的每条记录。相反,如果您将该字段分为名字和姓氏,那么您可以搜索

where last_name='Smith'

如果您在 last_name 上有一个索引,这将是一个非常快速的搜索。

如果您只是想在多个字段中的任何一个中查找输入的值,这样做会快得多

where estado='Toledo' or ciudad='Toledo' or pais='Toledo'

(假设您在 estado、ciudad 和 pais 上有索引),那么

where concat(estado, ciudad, pais) like '%Toledo%'

(没有索引会对你有任何好处)。

如果要进行不区分大小写的搜索,请在 upper(estado) 而不是 estado 等上创建索引。然后“where upper(estado)='TOLEDO'”可以使用该索引。

另外,我不确定 MySql,但如果 LIKE 不以通配符开头,某些数据库引擎可以使用索引。也就是说,“somefield like '%x%'”必须读取表中的每条记录。但是在某些数据库上,“像'x%'这样的某个字段”可以使用can索引来获取字段以“x”开头的记录,然后处理这些记录。

于 2012-10-22T20:23:16.640 回答
0

您需要全文搜索

这个链接可能有用Mysql全文搜索

于 2012-10-22T20:19:02.080 回答