1

クエリを実行していて、完全に一致するものが見つからない可能性のあるさまざまなユーザー入力があるとします。今、次のようなことをすることは可能でしょうか?

$query = "SELECT *,
              CASE matchingValues
                  WHEN $field1 LIKE '$a' THEN value = '1' ELSE value = '0'
                  WHEN $field2 LIKE '$b' THEN value = '1' ELSE value = '0'
                  WHEN $field3 LIKE '$c' THEN value = '1' ELSE value = '0'
                  WHEN $field4 LIKE '$d' THEN value = '1' ELSE value = '0'
                  WHEN $field5 LIKE '$e' THEN value = '1' ELSE value = '0'
              END AS score
              FROM . $usertable
              WHERE
                  $field1 LIKE '$a' AND
                  $field2 LIKE '$b' AND
                  $field3 LIKE '$c' AND
                  $field4 LIKE '$d' AND
                  $field5 LIKE '$d'
              ORDER BY score DESC";

if($result = mysql_query($query)) {

    if(mysql_num-rows($result)==NULL) {
    echo 'No Results Found';

    }else{

    ....
4

1 に答える 1

2

はい、これは可能ですが、句なしで実行し、合計スコアを取得するためにWHEREを使用する代わりに、すべての入力を合計する必要があります。CASELIKEステートメントはブール値1または0を返すため、それらを合計するだけで、一致するものの数を調べることができます。次にHAVING、実際に一致した行のみを返したい場合、句はスコア>0で返される行に制限されます。

  SELECT *,
      (($field1 LIKE '$a') +
      ($field2 LIKE '$b') +
      ($field3 LIKE '$c') +
      ($field4 LIKE '$d') +
      ($field5 LIKE '$e')) AS score
  FROM . $usertable
  HAVING score > 0
  ORDER BY score DESC";

%変数にワイルドカードがすでに追加されLIKEており、クエリで使用する前にワイルドカードが適切にエスケープされていることを前提としています。

ただし、この方法(貧乏人の全文検索)で実行できますが、MySQLでは、MyISAMテーブルの複数の列にまたがる全文索引を作成することができます。

更新:それらを人為的に重み付けするには...

それらに重みを付ける必要がある場合は、CASEステートメントを使用して、上位数個に高い数値を入力します。

  SELECT *,
      (CASE WHEN ($field1 LIKE '$a') THEN 5 ELSE 0 END +
      CASE WHEN ($field2 LIKE '$b') THEN 4 ELSE 0 END +
      CASE WHEN ($field3 LIKE '$c') THEN 3 ELSE 0 END +
      CASE WHEN ($field4 LIKE '$d') THEN 2 ELSE 0 END +
      CASE WHEN ($field5 LIKE '$e') THEN 1 ELSE 0 END) AS score
  FROM . $usertable
  HAVING score > 0
  ORDER BY score DESC";

最初の1つが一致することを強制するには、それをWHERE句に入れます。

  SELECT *,
      (($field1 LIKE '$a') +
      ($field2 LIKE '$b') +
      ($field3 LIKE '$c') +
      ($field4 LIKE '$d') +
      ($field5 LIKE '$e')) AS score
  FROM . $usertable
  WHERE $field1 LIKE '$a'
  HAVING score > 0
  ORDER BY score DESC";

繰り返しになりますが、明確にするために、非常に密接に関連する機能がすでに組み込まれており、MySQLの全文索引とMATCHキーワードに最適化されています。

于 2012-07-19T20:03:51.483 に答える