我有以下查询来确定故事收到的票数:
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
我可以在应用程序端执行该功能(我现在正在做),但我不能按功能提供的排名对其进行排序。
有任何建议吗?
答案 0 :(得分:4)
试试这个:
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
如果它适用于您的数据集,您可能需要检查此语句。
答案 1 :(得分:3)
y和z是棘手的。您希望基于x的值获得特定的回报。这听起来是制作功能的一个很好的理由。
http://dev.mysql.com/doc/refman/5.0/en/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,然后您拥有最终函数的所有值。