0

テーブルに、フィールドvotes_upvotes_downその他のアイテムのリストがあります。ここで、この2つのフィールドの関数である人気に基づいてアイテムを注文したいと思います。問題は、人気のあるアルゴリズムがの値に依存していることですvotes_up

たとえば、votes_up5より大きい場合:

popularity= (votes_up/votes_down)*20

投票数が50より大きい場合:

popularity= (votes_up/votes_down)*15

(これを使って説明しました。実際のアルゴリズムは異なります)。

通常、クエリでは次のようなことを行うため、これをどのように行うことができますか。

ORDER BY (votes_up/votes_down)*20)

ORDER BYしかし、その後に続くものはの値に依存しているため、今はこれを行うことができませんvotes_up。私がこれを行うことができる唯一の方法は次のとおりです。

if(votes_up >5){
    p = (votes_up/votes_down)*20;
} else if(votes_up > 50){
    p = (votes_up/votes_down)*15;
}

それから私のクエリで私は持つことができますORDER BY p

もちろん、これは有効なPHPではありませんが、問題について説明したいと思います。私が達成したいことをご理解いただければ幸いです。

4

1 に答える 1

1

ケースステートメントを使用して人気を計算し、それに基づいて注文することができます。次のようになります。

SELECT ((votes_up/votes_down)*(CASE WHEN votes_up > 50 THEN 15 WHEN votes_up > 5 THEN 20 ELSE ? END CASE)) as popularity, [ANY OTHER FIELDS]
FROM table
ORDER BY popularity DESC

あなたはvotes_up<=5で何をするかを決して述べなかったので、私?はその場合のためにただ入れます、あなたは空欄に記入することができます。

ただし、これではこの種類のインデックスを利用できないため、返されると予想される行数が多い場合、クエリの実行が遅くなる可能性があることに注意してください。

計算された人気値を格納するフィールドをテーブルに追加することを検討することをお勧めします(これは、賛成または反対の投票でアプリケーションによって更新されます)。次に、このフィールドにインデックスを付けて、より最適化された並べ替えを取得できます。

于 2013-01-17T17:01:10.893 に答える