对搜索多个表的搜索功能的建议? - PHP / MySQL

时间:2012-01-23 09:38:17

标签: php mysql search

在我的网络应用程序中,我打算包含一个搜索字段,允许用户输入字符串。

然后,此字符串将用于比较多个表中的数据行,例如在此数据库中。 (这只是一个例子,在实际问题中大约有20个表)。

表格列表:

  • 客户
  • 图书
  • 绘画

进行搜索的最佳方法是什么,因为这是我第一次做一个可以查看多个表的方法?

您是否只是按顺序浏览表格,将每一行与搜索字符串进行比较,还是可以进行一般搜索整个数据库的查询?

如果您找到完全匹配后是否应停止搜索?或者您是否继续搜索,无论您找到匹配项?如果有多个相同类型的行?

我想以最“正确”的方式做到这一点,我可以查看一些示例,但它们似乎只与一两个表搜索有关。

如果你能给我反馈意见的话,我脑子里还有这个伪代码,我可以这样做。

Get string from $_POST['search'] 
Strip string of special characters that could be used for Mysql injection.
Connect to db 
Search first table for row that is LIKE string
If match found then add to result object
Search next table, and repeat.
When finished search disconnect from DB.

所以我希望你们能够指导我链接到材料,这样我就可以尽可能地实现这一功能。

谢谢你:)

3 个答案:

答案 0 :(得分:1)

首先,让您知道,如果搜索条件为'包含'但不是starts with。此外,所有可搜索列都需要索引。

Whell,执行此查询的最简单方法是使用所有搜索字段的联合制作一个大视图:

create view my_search as (
   select 
     id_customer as key, 
     customer_name as value, 
     'customers' as table,
     1 as priority
   from customer
   UNION ALL
   select 
     id_customer as key, 
     customer_alternate_name as value, 
     'customers' as table,
     2 as priority
   from customer
   UNION ALL
   ...
   UNION ALL
   select 
     id_Paintings as key, 
     Paintings_name as value, 
     'Paintings' as table,
     8 as priority
   from Paintings
)

然后对视图执行查询:

select * from my_search
 where value like ...
 order by priority 

请注意,这并不能解决您的问题,只能从第一个出现字符串的表中获取结果,您可以在找到优先级更改时停止php获取行。

答案 1 :(得分:1)

除了单独搜索每个表格外,没有简单的方法可以解决这个问题。

你可以在一个选择中将它们联合起来我猜,但我会强烈反对你这样做。

为什么不寻找像Lucene Solr(http://lucene.apache.org/solr/)或Sphinx(http://sphinxsearch.com/)这样的搜索解决方案呢?我过去做过这个并取得了巨大的成功。

答案 2 :(得分:1)

首先,我有兴趣看到数据库设计 - 从你在那里的例子我认为可能有更好的设计。我不知道你的例子是否是实际的表格,但如果你使用的是这些表格,那么这些表格实际上有什么区别?

每当你发现自己正在查看相同字段的20个表时,你必须问问自己,你所做的事情是绝对唯一的方法,或者你是否在数据库设计中出了问题,或者确实在寻找以错误的方式处理问题。

所有这一切,如果你绝对必须让他们像这样讨价还价,那么你可以一次搜索多个表,虽然是以一种不愉快的方式 - 请参阅danihp的答案,了解使用UNION获取所需数据的示例。

我想你应该看看数据库而不是变化的代码,尽管我可能错了。