4

クエリから返された結果のリストを取得します。これは、最適なもので注文したいものです。私はできる限り明確にするように努めますが、何かが十分に明確でない場合は、私に知らせてください。私はそれをより明確にするよう努めます。

ユーザーは、と呼ばれる設定のリストをすでに入力していますfindsettings。これらfindsettingsで私は製品を探しています。彼がベストマッチを整理するまで、これはすべてうまくいきます。

などのいくつかのフィールドがありますmin_review, max_price, allows_pets, etc

注文したいです。たとえば、彼は最初に、、次に。の付いた製品を注文する必要がmin_review of 40%ありmax_price = 10.00ますallows_pets = 0。でそれを行うことができますがOR、リストの一番下にのみ、静かに一致しない結果も表示したいと思います。したがって、基本的に、彼は最初に最良の一致を示し、次に2番目、3番目など、最も一致しない製品まで表示する必要があります。

これをどう処理するかわからないので、私がそれを整理するのを手伝ってくれることを願っています。

4

1 に答える 1

7

基本的な原則は、各レコードの関連性スコアを作成し、それで並べ替えることです。

各基準の重みを等しくしたい場合、MySQLでは各ブール式を足し合わせるだけです(これは非標準のSQLであることに注意してください。他のRDBMSではCASE、条件をテストして数値を生成するために使用する必要がある場合があります)。

ORDER BY (review>=40/100) + (price<=10.00) + (allows_pets=0) DESC

基準が均等に重み付けされていない場合は、各式にその重みを掛けることができます。

ORDER BY 5*(review>=40/100) + 3*(price<=10.00) + 1*(allows_pets=0) DESC

および/または、あるサブセットで一致するものが、後の結果に関係なく常にORDER BY最初に表示される必要がある場合は、句を分割できます。

ORDER BY 5*(review>=40/100) + 3*(price<=10.00) DESC,
         1*(allows_pets=0) DESC

結果に関連性スコアを表示したい場合は、同様に上記の式のいずれかをに追加できますSELECT(次に、結果の列をORDER BY句で使用して、2回記述しないようにします)。

SELECT   *,
         (review>=40/100) + (price<=10.00) + (allows_pets=0) AS relevance,
FROM     my_table
ORDER BY relevance DESC

min_reviewあるターゲットに最も近い値(たとえば、正確ではなく40%に近い)を持つレコードを取得する場合は、そのターゲット値とターゲット値の(絶対?)差をとることができます。

IF(review>=40/100, review-40/100, NULL)

ただし、単一の基準で他の要素と組み合わせる場合は、式に適切な重みを付けるように注意する必要があります。

于 2012-11-12T11:02:54.300 に答える