3

私は広告サイトを開発しています。製品または会社を検索するために、前後にワイルドカード (%) を使用しています。

$keyword = "%".$user_keyword."%";

そして、次のmysqlクエリを使用しています:

$query = "SELECT DISTINCT   login.id_user,  
                login.company,
                login.district,
                FROM login LEFT JOIN products 
                ON login.id_user = products.id_user
                WHERE   (login.district LIKE ? 
                    AND login.place LIKE ?)
                        AND
                    (login.company LIKE ?
                    OR login.summary LIKE ?
                    OR products.description LIKE ?)
                LIMIT ?, ?";    
                ";

これは機能しています。しかし、キーワードを参照してリストをソートしたい。例: ユーザーが「foo」を検索すると、次の結果が得られる場合があります。

fool
kafoo
safoora
foo
foolan

最初の項目として「foo」を取得したい

4

2 に答える 2

1

以下を試してください:

$query = "SELECT DISTINCT   login.id_user,  
                login.company,
                login.district,
                FROM login LEFT JOIN products 
                ON login.id_user = products.id_user
                WHERE   (login.district LIKE ? 
                    AND login.place LIKE ?)
                        AND
                    (login.company LIKE ?
                    OR login.summary LIKE ?
                    OR products.description LIKE ?)
                order by if(LOCATE('$user_keyword', login.district)=0, 9999, LOCATE('$user_keyword', login.district))+
                         if(LOCATE('$user_keyword', login.place)=0, 9999, LOCATE('$user_keyword', login.place))+
                         if(LOCATE('$user_keyword', login.company)=0, 9999, LOCATE('$user_keyword', login.company))+
                         if(LOCATE('$user_keyword', login.summary)=0, 9999, LOCATE('$user_keyword', login.summary))+
                         if(LOCATE('$user_keyword', products.description)=0, 9999, LOCATE('$user_keyword', products.description))
                LIMIT ?, ?";    
                ";
于 2013-11-10T18:06:28.610 に答える
0

結果の最初の一致として完全一致が必要な場合は、クエリに次のようなものを追加する必要があります。

[...]
ORDER BY
  CASE
    WHEN checked_column = 'keyword' THEN 1  /* exact match */
    ELSE 2  /* non-exact match */
  END,
  checked_column  /* sort non-exact matches */

ただし、特定のキーワードとの類似性を反映するために結果にスコアを付けるなど、より洗練された並べ替えが必要な場合は、編集距離と呼ばれる概念を探しています。

于 2013-11-10T17:18:36.283 に答える