如何在MySQL中搜索多个表

时间:2012-05-13 15:02:37

标签: php mysql search full-text-indexing

详细

想象一下,我们的表格看起来像这样:

enter image description here

如您所见,questions通过外键与4个表连接。

使用Datatablesserver-side processing(我修改了给定的PHP代码来处理多个表格)用于客户端。

问题

我想要做的是:当用户搜索某些内容时,客户端会通过ajax将关键字发送到服务器端。在官方网站(link to page)处理搜索的代码片段如下:

$sWhere = "";
if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" )
{
    $sWhere = "WHERE (";
    for ( $i=0 ; $i<count($aColumns) ; $i++ )
    {
        $sWhere .= "`".$aColumns[$i]."` LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
    }
    $sWhere = substr_replace( $sWhere, "", -3 );
    $sWhere .= ')';
}

我想修改此部分以处理多个表处理。

例如:如果用户输入了某个部分的名称(名称位于sections表,section列),我如何找到与此部分相关的问题(来自questions表)?这是唯一的查询吗?

任何建议都将非常感谢:)

2 个答案:

答案 0 :(得分:0)

您可以使用Union Select并合并您的结果。只需在之前的select中使用带有相同选定列的union:

$sWhere = "";
if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" )
{
    $sWhere = "WHERE (";
    for ( $i=0 ; $i<count($aColumns) ; $i++ )
    {
        $sWhere .= "`".$aColumns[$i]."` LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
    }
    $sWhere = substr_replace( $sWhere, "", -3 );
    $sWhere .= ')';


    $sWhere .= ' UNION SELECT question FROM questions , sections WHERE ( sections.`section` LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' AND questions.section = sections.id ) "; //this union in select columns count  must be same with your previous Select columns count 

}

答案 1 :(得分:0)

你根本不应该使用LIKE运算符,特别是如果这些表可以超过几百行。喜欢前面的通配符(例如LIKE '%key'LIKE '%key%')不能使用任何索引来优化搜索,这意味着只有数千行,这些查询可能会变得很慢。

理想情况下,您应该构建一个非规范化结构,该结构在单行中包含任何可搜索文本的信息,然后将其放入全文搜索中,并将其用于查询。它可能是MySQL本身在MyISAM表中支持的FULLTEXT密钥,或者是外部全文搜索引擎,例如Sphinx(http://www.sphinxsearch.com/)。

您将其归一化为单一结构,您将能够非常轻松地完成所有查询。

这并不意味着您应该摆脱基础结构,而是为了为此类搜索构建有效的解决方案,您将不得不引入一些数据重复。