0

我的表中有一个项目列表,包括字段votes_upvotes_down其他项目。现在我想根据流行度来订购商品,这是这两个领域的功能。问题是流行度算法取决于 的值votes_up

例如,如果votes_up大于 5:

popularity= (votes_up/votes_down)*20

如果 votes_up 大于 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 回答