mysql извлекает данные между двумя временными метками unix

Я хочу использовать следующий запрос с уверенностью в оценке Уилсона, взятый из как не сортировать по среднему рейтингу, чтобы рассчитать релевантный контент на основе голосов за последние 24 часа с момента поиска пользователем. У меня есть временные метки unix, хранящиеся в поле, но это не тип datetime.

Теперь запрос:

 SELECT p.id, p.post, p.upvotes, p.downvotes, ((upvotes + 1.9208) / (upvotes + downvotes) - 
 1.96 * SQRT((upvotes * downvotes) / (upvotes + downvotes) + 0.9604) /
         (upvotes + downvotes)) / (1 + 3.8416 / (upvotes + downvotes)) 
   AS ci_lower_bound FROM posts p WHERE upvotes + downvotes > 0 
   ORDER BY ci_lower_bound DESC;

Мне нужно получить самый популярный контент, опубликованный за последние 24 часа. Я знаю, что мне нужно поставить дополнительное WHERE условие, используя BETWEEN, но не знаю, как это сделать?

Пожалуйста помоги.

ОБНОВЛЕНИЕ. Основываясь на ответе ниже и некоторых настройках, я сделал что-то вроде этого:

 SELECT p.id, p.post, p.upvotes, p.downvotes, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
 / (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
 / (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound 
 FROM posts p WHERE upvotes + downvotes > 0 
 AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802 ORDER BY ci_lower_bound DESC

Первое значение я рассчитал путем вычитания 86400 секунд (т.е. 24 часа) из текущей метки времени и получил результаты. Пожалуйста, если вы думаете, что его еще можно улучшить, предложите мне.


person coder101    schedule 04.04.2013    source источник
comment
Вам понадобится метка времени каждого голосования. Это где-то в вашей базе данных?   -  person Marty McVry    schedule 04.04.2013
comment
@MartyMcVry Да, это так. он хранится в другой таблице с именем rating с отметками времени, идентификатором сообщения и флагом типа голосования, то есть 1 для положительного и 2 для отрицательного голоса. Но я подумал, что должен отсортировать его по времени публикации сообщения, а не по количеству голосов. Я ошибся?   -  person coder101    schedule 04.04.2013
comment
@MartyMcVry Хорошо, позвольте мне перефразировать: мне нужен лучший контент на основе голосов (то есть самых популярных) за последние 24 часа. Теперь, учитывая это, как ты думаешь, что мне делать? Можете ли вы предоставить образец кода, возможно, отредактировать мой запрос, если его не слишком много?   -  person coder101    schedule 04.04.2013
comment
Нет, вы правы ... Не прочитали ваш вопрос должным образом ... Вы также хотели, чтобы сообщения были за последние 24 часа, так что это решает проблему.   -  person Marty McVry    schedule 04.04.2013
comment
@MartyMcVry Можете ли вы увидеть обновленный запрос и узнать, правильно ли я его использую?   -  person coder101    schedule 04.04.2013
comment
Ваш запрос верен. Было бы действительно проще рассчитать метку времени вне вашего запроса.   -  person Marty McVry    schedule 04.04.2013


Ответы (1)


person    schedule
comment
NOW() будет текущим временем сервера. что, если он находится в другом часовом поясе, чем пользователь? Я хотел бы использовать временную метку unix, взятую с компьютера пользователя, или, возможно, IP-адрес. Не могли бы вы отредактировать, чтобы показать, как я могу использовать метку реального времени вместо NOW() - person coder101; 04.04.2013
comment
@ coder101: принимая во внимание относительность, NOW() будет означать «сейчас» независимо от часового пояса. Но вот и вы, смотрите пост-обновление. - person Quassnoi; 04.04.2013
comment
что такое ts? Я предполагаю, что это будет новое поле, созданное для облегчения сортировки по времени, и оно не должно быть именем моего поля метки времени? - person coder101; 04.04.2013
comment
@MartyMcVry и Quassnoi дают пустой результат, когда я помещаю метку времени вместо NOW(). Сейчас я использую запрос SELECT p.id, p.post, p.upvotes, p.downvotes, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes) / (upvotes + downvotes) + 0.9604) / (upvotes + downvotes)) / (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound FROM posts p WHERE upvotes + downvotes > 0 AND p.unix_timestamp BETWEEN UNIX_TIMESTAMP(1363109802 - INTERVAL 1 DAY) AND UNIX_TIMESTAMP(1363109802) ORDER BY ci_lower_bound DESC - person coder101; 04.04.2013
comment
я думаю вместо функции UNIX_TIMESTAMP, FROM_UNIXTIME будет использоваться. я прав? - person coder101; 04.04.2013
comment
Ваше поле unix_timestamp должно быть int, а не varchar (для ясности). FROM_UNIXTIME используется только для преобразования метки времени в фактическую дату, которая вам не нужна, потому что вы используете метку времени. - person Marty McVry; 04.04.2013
comment
@MartyMcVry ну, это варчар. но я использую его только потому, что при сохранении значений при использовании INT он каким-то образом не работал - person coder101; 04.04.2013
comment
@MartyMcVry Даже после изменения типа на INT вышеуказанный запрос все еще дает пустой результат. какая возможность? - person coder101; 04.04.2013
comment
@MartyMcVry Кроме того, я просто использовал EXPLAIN для запроса, и в столбце Extra указано Impossible WHERE noticed after reading const tables. Это что-то для тебя значит? - person coder101; 04.04.2013
comment
@ coder101: опубликуйте, пожалуйста, определение вашей таблицы, несколько примеров данных и желаемый результат. - person Quassnoi; 04.04.2013
comment
как мне поставить все это в вопросе? или есть ли какой-нибудь веб-сайт, на котором я могу разместить часть sql - person coder101; 04.04.2013
comment
привет, я поместил здесь образец кода SQL Fiddle. Пожалуйста, проверьте и дайте мне знать - person coder101; 04.04.2013
comment
@MartyMcVry Не могли бы вы также проверить мой код по только что предоставленной ссылке. мне действительно нужна помощь здесь. - person coder101; 04.04.2013
comment
привет, я обновил вопрос, добавив немного измененную версию вашего запроса. Как ты думаешь, это правильно? - person coder101; 04.04.2013