2008-09-30 24 views
8

Tôi đã có các truy vấn sau đây để xác định có bao nhiêu phiếu bầu một câu chuyện đã nhận được:Làm cách nào để áp dụng hàm toán học cho truy vấn MySQL?

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 

Tôi muốn áp dụng các chức năng toán học sau đây để nó cho câu chuyện sắp tới (Tôi nghĩ rằng đó là những gì reddit sử dụng) - http://redflavor.com/reddit.cf.algorithm.png

Tôi có thể thực hiện chức năng ở phía ứng dụng (hiện tôi đang làm), nhưng tôi không thể sắp xếp nó theo thứ hạng mà hàm cung cấp.

Bất kỳ lời khuyên nào?

Trả lời

4

Hãy thử điều này:

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 

Bạn có thể cần phải kiểm tra tuyên bố này nếu nó hoạt động với bộ dữ liệu của bạn.

+0

Cảm ơn vì điều này, tôi đã thử nó nhưng nó nói "Mỗi bảng có nguồn gốc phải có bí danh riêng của mình" ... –

+0

xin lỗi: S đã được sửa – Jonathan

3

y và z là những điều phức tạp. Bạn muốn trả về cụ thể dựa trên giá trị của x. Điều đó nghe có vẻ giống như một lý do tốt để thực hiện một chức năng.

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

Bạn nên thực hiện 1 chức năng cho y và một cho z. vượt qua trong x, và mong đợi một số trở lại.

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; 

Có y. Tôi đã làm nó bằng tay mà không kiểm tra, do đó bạn có thể phải sửa chữa một vài lỗi đánh máy. Thực hiện theo cùng một cách, và sau đó bạn có tất cả các giá trị cho hàm cuối cùng của mình.

+0

Tôi quên cung cấp cho bạn liên kết này http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html Rằng bạn không cần phải phát minh lại bánh xe cho abs , v.v. p.s. Tôi <3 Đặt Lý thuyết. –

+0

=) Cảm ơn, tôi cũng sẽ thử cái này. –

Các vấn đề liên quan