我的表格中有一个项目列表,其中包含字段votes_up
和votes_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,但我只是想解释一下我的问题。我希望你明白我想要达到的目标。
答案 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所以我只为这个案例添加?
,你可以填空。
但请注意,这将无法使用此类型的索引,因此如果您希望返回大量行,则查询可能执行缓慢。
您可能需要考虑在表中添加一个字段,该字段存储计算的受欢迎度值(应用程序在投票时上下调整)。然后,您可以索引此字段并获得更优化的排序。