Как я могу применить математическую функцию к запросу 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
Я бы хотел применить к нему следующую математическую функцию для будущих историй (я думаю, это то, что использует reddit). - http://redflavor.com/reddit.cf.algorithm.png
Я могу выполнить функцию на стороне приложения (что я и делаю сейчас), но я не могу отсортировать ее по ранжированию, которое предоставляет функция.
Есть какой-нибудь совет?
Решение
Попробуй это:
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
Возможно, вам потребуется проверить это утверждение, работает ли оно с вашими наборами данных.
Другие советы
y и z - самые хитрые из них.Вам нужен конкретный возврат, основанный на значении x.Это звучит как веская причина для создания функции.
http://dev.mysql.com/doc/refman/5.0/en/if-statement.html
Вы должны создать 1 функцию для y и одну для 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 таким же образом, и тогда у вас будут все значения для вашей конечной функции.