2017-02-28 45 views
1

私は、ユーザが検索した単語(または単語)を含むすべての結果を表示しようとしています。私はある範囲で動作するいくつかのコードを持っていますが、余分な単語が一致した結果の最後に追加された場合、結果は返されません。部分一致MySQLクエリ

ユーザが「Fork」を検索した場合、「Fork Parts」と入力した場合は「Fork Parts」というカテゴリがないため、結果は返されません。しかし、「フォーク」という言葉が一致しているので、結果を返すことにします。

function getCat($string) { 
    global $wpdb; 

    $cat = $wpdb->get_results(" 
     SELECT * 
     FROM wpmj8c_term_relationships 
     LEFT JOIN wpmj8c_term_taxonomy 
     ON (wpmj8c_term_relationships.term_taxonomy_id = wpmj8c_term_taxonomy.term_taxonomy_id) 
     LEFT JOIN wpmj8c_terms on wpmj8c_term_taxonomy.term_taxonomy_id = wpmj8c_terms.term_id 
     WHERE wpmj8c_term_taxonomy.taxonomy = 'product_cat' && wpmj8c_terms.name LIKE '%".$string."%' 
     GROUP BY wpmj8c_term_taxonomy.term_id 
    "); 

    echo $cat; 

    foreach ($cat as $search_result) { 
     echo '<li><a href="/product-category/'.$search_result->slug.'">'.$search_result->name.'</a></li>'; 
    } 

} 

<ul> 
    <?php getCat("Fork"); ?> 
</ul> 
+0

あなたは、データベース内に何表示する必要があります....あなたのコードは「特別フォークパーツ」または「特別フォーク部品ABC」が、*ない*「フォーク特殊部品」 – hage

+0

を見つけるだろう、私は再単語ことができると思います私が言ったこと。ユーザーが "Fork"を検索した場合、 "Fork Parts"と入力した場合、 "Fork Parts"というカテゴリがないため、結果は返されません。私は、しかし、 "フォーク"が一致したので結果を返すしたいです。 –

答えて

0

()の違いがあります。

$arr = explode(' ','this test test1'); 
    $str = ''; 
    $i = 1; 
    $arrCount = count($arr); 

    foreach($arr as $v){ 
     if($arrCount > 1 && $i == 1) { $str.= '('; } 
     $str.= 'wpmj8c_terms.name LIKE "%'.$v.'%" '; 
      if($arrCount > 1 && $arrCount == $i) { $str.= ')'; } elseif($arrCount > 1 && $arrCount != $i) { $str .= " OR " ;} 
     $i++; 
    } 

$cat = $wpdb->get_results("SELECT * 
    FROM wpmj8c_term_relationships 
    LEFT JOIN wpmj8c_term_taxonomy 
    ON (wpmj8c_term_relationships.term_taxonomy_id = wpmj8c_term_taxonomy.term_taxonomy_id) 
    LEFT JOIN wpmj8c_terms on wpmj8c_term_taxonomy.term_taxonomy_id = wpmj8c_terms.term_id 
    WHERE wpmj8c_term_taxonomy.taxonomy = 'product_cat' AND $str 
    GROUP BY wpmj8c_term_taxonomy.term_id"); 
+0

で確認してください。これは素晴らしいことです。ありがとうございます。この回答は私の質問に答えますが、私には別の側面の質問があります。どの検索結果の上位にもユーザーの検索語句に最も近い検索結果を表示するにはどうすればよいでしょうか?たとえば、「アクセサリ」を検索すると、完全に一致しているので、最初にそのディスプレイを表示しますか? –

+0

これを行うには、2つのクエリを書いて別の配列変数に結果を格納し、それらをマージする必要があります。まず、 'Accessories'(=を使用)の結果を取得し、関連する結果を取得します(LIKE %%を使用)。今度は、最初の結果が2番目の結果で繰り返されていないことを確認してください(IDを比較して2番目の結果からユニークを取得し、最初の結果とマージできるかもしれません)。 – Karthikeyani

0

$arr = explode(' ','this test'); 
    $str = ''; 
    foreach($arr as $v){ 
     $str.= 'wpmj8c_terms.name LIKE "%'.$v.'%" OR '; 
    } 
    $str = rtrim($str," OR "); 

    $cat = $wpdb->get_results("SELECT * 
    FROM wpmj8c_term_relationships 
    LEFT JOIN wpmj8c_term_taxonomy 
    ON (wpmj8c_term_relationships.term_taxonomy_id = wpmj8c_term_taxonomy.term_taxonomy_id) 
    LEFT JOIN wpmj8c_terms on wpmj8c_term_taxonomy.term_taxonomy_id = wpmj8c_terms.term_id 
    WHERE wpmj8c_term_taxonomy.taxonomy = 'product_cat' && $str 
    GROUP BY wpmj8c_term_taxonomy.term_id"); 

スペースHTABとして考えmysqlのであるので、これを試してみてください。 これはうまくいきます。

+0

これはほとんど動作します。 「アクセサリ」と入力すると結果が返されません。「Motorbike Accessories」と入力すると結果が返されます。なぜこれが起こっているのでしょうか?説明を明確にするために、2番目の検索語で返される結果は次のとおりです。 エキゾーストアクセサリー、 アクセサリー、 センターアクセサリースタンド、 リアはアクセサリースタンド、あなたは$ strの= RTRIM($ strの、 "OR")これを追加した –

+0

サイドスタンドアクセサリー。 条件が満たされていれば、文字列はきめ細かいクエリを生成しています – rahulsm

+0

はい、ありますが、結果が正しく返されません。 「アクセサリ」と入力すると、「アクセサリ」と一致するクエリのすべての単語が表示されますが、そうではありません。 「Rear Stand Accessories」と入力すると「Accessores」と「Rear Stand Accessories」が表示されますが、「Accessories」の結果が表示されないのはなぜですか? –