想象一下,我们的表格看起来像这样:
如您所见,questions
通过外键与4个表连接。
使用Datatables和server-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
表)?这是唯一的查询吗?
任何建议都将非常感谢:)
答案 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/)。
您将其归一化为单一结构,您将能够非常轻松地完成所有查询。
这并不意味着您应该摆脱基础结构,而是为了为此类搜索构建有效的解决方案,您将不得不引入一些数据重复。