1

現在、許容可能な一致を検索し、次を使用して並べ替える SQL クエリがあります。

ORDER BY ABS (itemranking - $rating)

次のような条件を追加できるように、クエリが処理されるときに「アイテムランキング」を何らかの方法で変更することは可能ですか?

if (category == '$category')

アイテムの ABS から 1 を引きます。

それからORDER BY ABS

これが適切なコードを知っている人にとっての簡単な答えなのか、それともより大きな概念的な「どうすればこの結果を達成できるか」タイプの質問なのかはわかりません。

いずれにせよ、いくつかのコンテキストが役立つ場合があります。目標は、値「評価」に一致するように一連の提出物を並べ替えることですが、ユーザーが探しているカテゴリにあるアイテムにブーストを与えることでもあります。

実際の例 (私のサイトではありません): ショッピング サイトは、価格に関して最も近い一致を検索するフィルターを提供できますが、特定のカテゴリ (たとえば、「赤」) 内のすべてのアイテムが一致するのに 10 ドル近いかのように機能します。彼らが実際よりも。

4

3 に答える 3

1

ORDER BY 式内で CASE ステートメントを使用して結果を動的に順序付けする、次のタイプの SQL を使用してみませんか?

これはよりSQL指向のソリューションであるため、質問にどの程度当てはまるかわかりません。

SELECT *
FROM Table
ORDER BY CASE Category 
           WHEN '$category' THEN ABS(ItemRanking - $rating - 1) 
           ELSE ABS(ItemRanking - $rating)
         END
于 2012-08-12T02:07:05.700 に答える
0

既に述べたように、Select クエリでテスト条件を使用するには、Case ステートメントを使用します。既に示した例に加えて、コードの他の例を以下に示します。

Order By ABS (itemranking - $rating) - 
  Case When category == '$category' Then 1 Else 0 End

また

Order By ABS (Case when category == '$category' then (itemranking - $rating - 1)
  Else (item - $rating) End)

また、MySQL、MS-SQL Server、またはその他の SQL サーバーを使用しているかどうかについても言及していません。MySQL では正常に動作するものでも、MS-SQL Server では動作しない可能性があり、その逆も同様です。

于 2012-08-12T05:02:12.020 に答える
0

次のようなことをします

Select if(category='$category', ABS (itemranking - $rating) - 1, ABS (itemranking - rating)) as calc 
FROM table 
ORDER BY calc
于 2012-08-12T02:26:10.833 に答える