3

私はこの質問で尋ねられたのと同様の質問があります

MySQL-関連性で注文する方法は?INNODBテーブル

違いは、ここでは5つのフィールドから検索したいです。

add1、add2、add3、post_town、post_code

また、post_codeフィールドのレコードのみが空ではなくなり、他のフィールドのレコードは場所によっては空になる場合があります。キーワードkingstonを検索すると、

Acre Road, Kingston upon Thames, KT2 6EA

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

これらの結果は、add1、add2、add3、post_town、post_codeのすべてのフィールドの組み合わせです。

この結果は次の順序で必要です

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

Acre Road, Kingston upon Thames, KT2 6EA

私の現在のSQLクエリは次のようなものです

SELECT add1, add2, add3, post_town, post_code FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
OR add2 LIKE '%".$keyword."%'
OR add3 LIKE '%".$keyword."%'
OR post_town LIKE '%".$keyword."%'
OR post_code LIKE '%".$keyword."%'

したがって、検索キーワードが最初に来るレコードが最初に来る必要があります。どうやってやるの ?

4

3 に答える 3

5

きれいではありませんが、うまくいくはずです!

select a.* from (
SELECT add1, add2, add3, post_town, post_code, 1 as rank FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 2 as rank FROM address_mst 
WHERE add2 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 3 as rank FROM address_mst 
WHERE add3 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 4 as rank FROM address_mst 
WHERE post_town LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 5 as rank FROM address_mst 
WHERE post_code LIKE '%".$keyword."%'
) a
order by a.rank asc;
于 2011-09-28T11:55:05.850 に答える
1

関連性ベースの並べ替えの場合、全文検索がより信頼性の高いオプションです。

FULL TEXT SEARCH検索された用語の出現回数に基づいて関連性を使用しました。これは、後で返される結果の注文に使用される可能性があります。

于 2011-09-28T13:14:14.283 に答える
1

クエリを使用して最小の適格な結果を選択し、スクリプトで独自のロジックを使用して、結果に事前のランキングの重みを与え、それに応じて並べ替えてみませんか?

それはあなたを助けるでしょう:

  1. クエリで可能な場合とできない場合がある、より複雑なランキング基準があります。

  2. ランキング基準が変更された場合、SQLクエリを編集しません。

于 2011-09-28T11:59:36.830 に答える