如何将数学函数应用于MySQL查询?
时间:2020-03-06 14:55:57 来源:igfitidea点击:
我有以下查询以确定一个故事获得了多少票:
SELECT s_id, s_title, s_time, (s_time-now()) AS s_timediff, ( (SELECT COUNT(*) FROM s_ups WHERE stories.q_id=s_ups.s_id) - (SELECT COUNT(*) FROM s_downs WHERE stories.s_id=s_downs.s_id) ) AS votes FROM stories
我想将以下数学函数应用于即将来临的故事(我认为这是reddit使用的函数)
http://redflavor.com/reddit.cf.algorithm.png
我可以在应用程序端执行该功能(我现在正在执行),但是我无法按该功能提供的排名对其进行排序。
有什么建议吗?
解决方案
y和z是棘手的。我们想要基于x的值的特定回报。这听起来像是发挥作用的充分理由。
http://dev.mysql.com/doc/refman/5.0/zh-CN/if-statement.html
我们应该为y设置1个函数,为z设置一个函数。传入x,并期望返回一个数字。
DELIMINATOR // CREATE FUNCTION y_element(x INT) RETURNS INT BEGIN DECLARE y INT; IF x > 0 SET y = 1; ELSEIF x = 0 SET y = 0; ELSEIF x < 0 SET y = -1; END IF; RETURN y; END //; DELIMINATOR;
有y。我是手工做的,没有检查,所以我们可能不得不修正一些错字。
以相同的方式执行z,然后我们将拥有最终函数的所有值。
试试这个:
SELECT s_id, s_title, log10(Z) + (Y * s_timediff)/45000 AS redditfunction FROM ( SELECT stories.s_id, stories.s_title, stories.s_time, stories.s_time - now() AS s_timediff, count(s_ups.s_id) - count(s_downs.s_id) as X, if(X>0,1,if(x<0,-1,0)) as Y, if(abs(x)>=1,abs(x),1) as Z FROM stories LEFT JOIN s_ups ON stories.q_id=s_ups.s_id LEFT JOIN s_downs ON stories.s_id=s_downs.s_id GROUP BY stories.s_id ) as derived_table1
我们可能需要检查此语句是否适用于数据集。