簡體   English   中英

如何在MySQL中的多個表中搜索

[英]How to search inside multiple tables in MySQL

詳細

想象一下,我們有這樣的表:

在此處輸入圖片說明

如您所見, questions通過外鍵與4個表關聯。

客戶端使用Datatables進行服務器端處理 (我修改了給定的php代碼以處理多個表)。

我想做的是:當用戶搜索某些內容時,客戶端通過ajax將關鍵字發送到服務器端。 在官方網站上處理搜索的代碼段( 鏈接到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表中找到)? 只有一個查詢有可能嗎?

任何建議將不勝感激 :)

您可以使用聯合選擇並合並結果。 只需在先前的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 

}

完全不應該使用LIKE運算符,尤其是當這些表可以增長到幾百行時。 前面帶有通配符的LIKE '%key' (例如LIKE '%key'LIKE '%key%' )不能使用任何索引來優化搜索,這意味着這些查詢可能變得非常慢,只有數千行。

理想情況下,您應該構建一個非規范化的結構,該結構在一行中包含所有可文本搜索的信息,然后將其放入全文搜索中,然后將其用於查詢。 它可以是MySQL本身在MyISAM表中支持的FULLTEXT鍵,也可以是外部全文本搜索引擎,例如Sphinx(http://www.sphinxsearch.com/)。

您可以將其反規范化為單個結構,就可以非常輕松地執行所有查詢。

這並不意味着您應該擺脫基礎結構,而是要為此類搜索構建有效的解決方案,則必須引入一些數據重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM