【问题标题】:How can I apply mathematical function to MySQL query?如何将数学函数应用于 MySQL 查询?
【发布时间】:2010-09-14 07:21:55
【问题描述】:

我有以下查询来确定一个故事获得了多少票:

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

我可以在应用程序端执行该功能(我现在正在这样做),但我无法按照该功能提供的排名对其进行排序。

有什么建议吗?

【问题讨论】:

    标签: php mysql voting


    【解决方案1】:

    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;
    

    有。我是手工完成的,没有检查,所以你可能需要修正一些错字。 以同样的方式执行 z,然后您将获得最终函数的所有值。

    【讨论】:

    【解决方案2】:

    试试这个:

        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
    

    如果它适用于您的数据集,您可能需要检查此语句。

    【讨论】:

    • 谢谢你,我试过了,但它说“每个派生表都必须有自己的别名”...
    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多