订购算法依赖于IF语句

时间:2013-01-17 16:57:42

标签: php mysql algorithm sorting

我的表格中有一个项目列表,其中包含字段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,但我只是想解释一下我的问题。我希望你明白我想要达到的目标。

1 个答案:

答案 0 :(得分: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

你从未说过如何处理vote_up< = 5所以我只为这个案例添加?,你可以填空。

但请注意,这将无法使用此类型的索引,因此如果您希望返回大量行,则查询可能执行缓慢。

您可能需要考虑在表中添加一个字段,该字段存储计算的受欢迎度值(应用程序在投票时上下调整)。然后,您可以索引此字段并获得更优化的排序。