8

記事が受け取った投票数を判断するために、次のクエリを取得しました。

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

アプリケーション側で機能を実行できますが (現在実行中)、機能が提供するランキングで並べ替えることができません。

何かアドバイスはありますか?

4

2 に答える 2

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

データセットで機能する場合は、このステートメントを確認する必要がある場合があります。

于 2008-09-30T23:56:04.330 に答える
3

y と z はトリッキーなものです。x の値に基づいて特定のリターンが必要です。これは、関数を作成する正当な理由のように思えます。

http://dev.mysql.com/doc/refman/5.0/en/if-statement.html

y に対して 1 つの関数を作成し、z に対して 1 つの関数を作成する必要があります。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 を同じ方法で実行すると、最終的な関数のすべての値が得られます。

于 2008-09-30T17:26:29.963 に答える