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 を使用して、結果を組み合わせることができます。前の 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'またはLIKE '%key%') は、検索を最適化するためにインデックスを使用できません。

理想的には、テキスト検索可能な情報を 1 行に含む非正規化構造を構築し、それを全文検索に投入して、代わりにそれをクエリに使用する必要があります。これはFULLTEXT、MySQL が MyISAM テーブルでネイティブにサポートするキー、またはたとえば Sphinx (http://www.sphinxsearch.com/) などの外部全文検索エンジンである可能性があります。

これを単一の構造に非正規化すると、すべてのクエリを非常に簡単に実行できるようになります。

これは、基本構造を取り除く必要があるという意味ではありませんが、そのような検索の効率的なソリューションを構築するには、データの重複を導入する必要があります。

于 2012-05-13T16:22:32.643 に答える