1

详细的

想象一下,我们有如下表格:

在此处输入图像描述

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

Datatables服务器端处理(我修改给定的 php 代码以处理多个表)一起用于客户端。

问题

我想要做的是:当用户搜索某些东西时,客户端通过 ajax 将关键字发送到服务器端。处理官网搜索的代码(页面链接)如下所示:

$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与该部分相关的问题(从表中)?这可能只需要一个查询吗?

任何建议将不胜感激 :)

4

2 回答 2

0

您可以使用 Union Select 并组合您的结果。只需在先前的选择中使用与相同选定列的联合:

$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 

}
于 2012-05-13T15:34:43.463 回答
0

您根本不应该为此使用 LIKE 运算符,尤其是当这些表可以增长到超过几百行时。LIKE 前面带有通配符(例如LIKE '%key'or LIKE '%key%')不能使用任何索引来优化搜索,这意味着这些查询可能会变得非常慢,只有数千行。

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

如果您将其非规范化为单个结构,您将能够非常轻松地完成所有查询。

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

于 2012-05-13T16:22:32.643 回答