2016-11-18 4 views
0

Я пытаюсь сделать подобный сайт, чтобы Hacker News и я нашел этот алгоритм, который должен помочь мне разобраться ссылки на мой сайт, здесь:Как сделать сложный SQL запрос

Score = (P-1)/(T+2)^G 

where, 
P = points of an item (and -1 is to negate submitters vote) 
T = time since submission (in hours) 
G = Gravity, defaults to 1.8 in news.arc 

так что я нужно сделать SQL-запрос, который будет сортировать данные, используя приведенное выше уравнение, но я не знаю, как это сделать. Вот моя структура таблицы:

Table 1 name: links 
Table 1 fields: id, title, url, user_id, created_at 

Table 2 name: votes 
Table 2 fields: id, user_id, link_id, vote, created_at 

в таблице 2 голос может быть один из трех значений: 1, 0, -1

Так что даже можно сделать с SQL или я должен сделать это каким-то другим способом?

+0

Правильно вставьте свое уравнение правильно и используйте 'POWER()' для вашего^G – scsimon

+0

. Что должно быть 'T'? Время в днях? – developer

+0

T - текущее время за вычетом времени создания ссылки. –

ответ

2

Если вы хотите использовать только метод SQL.

Сначала карту каждый параметр с кандидатом в таблицах:

P Сумма голоса столбца в таблице votes.

T Текущая дата - now() функция - минус created_at столбец в таблице links.

G Постоянный.

Учитывая это, следующий оператор SQL select должен возвращать оценку для каждой ссылки.

select links.id, (sum(vote) - 1)/POWER(DATEDIFF(now(),links.created_at)*24 + 2, 1.8) 
from links, votes 
where links.id = votes.link_id 
group by links.id 

sum(vote) ==>P

DATEDIFF(now(),links.created_at)*24 ==>T.

1.8 ==>G

+0

Это, похоже, работает с небольшими изменениями:) –

+0

Я просто изменил некоторые из них на это: (сумма голосов - 1)/POWER (time_to_sec (TIMEDIFF (now(), links.created_at))/3600, 1.8) as rank и также добавлен в конец ORDER BY rank DESC –

1

Соедините две таблицы, и использовать SUM(), чтобы получить число голосов. Я со скидкой голоса подателя при использовании v.user_id != l.user_id при присоединении.

Вы можете получить T используя SUBTIME().

SELECT l.*, IFNULL(SUM(v.vote), 0) AS votes 
FROM links AS l 
LEFT JOIN votes AS v ON v.link_id = l.id AND v.user_id != l.user_id 
GROUP BY l.id 
ORDER BY votes/POWER(SUBTIME(NOW(), l.created_at), 1.8) 

Чтобы исправить ошибку, выполните группировку в подзапросе и заказе во внешнем запросе.

+0

Я получаю следующую ошибку: SQLSTATE [42S22]: Столбец не найден: 1247 Ссылка «голосов» не поддерживается (ссылка на функцию группы) –

+0

Я понял, что часть, вызывающая проблемы, this: POWER (SUBTIME (NOW(), l.created_at), 1.8) –

+0

Я изменил его, чтобы сделать группировку в подзапросе. – Barmar