PHP MySQL Query самый популярный за последние 24 часа

Скажем, я хочу получить десять записей с МАКСИМАЛЬНЫМ количеством лайков за последние 24 часа. Вот что у меня есть до сих пор:

$date = date("o-m-d");
$query = "SELECT date_created,COUNT(to),from,to FROM likes WHERE date_created LIKE '$date%' GROUP BY to ORDER BY COUNT(to) DESC LIMIT 10";

Проблема с этим заключается в том, что он получает наибольшее количество лайков только с ТОГО ДНЯ, независимо от того, как далеко он продвинулся. За последние 24 часа он не получает больше всего лайков.

структура лайков: от | к | дата_создания | я бы

даты указаны в стандартном формате ISO - пример 2010-07-14T00:35:31-04:00. Приходите прямо из справочника по PHP: date("c");


person Dylan Taylor    schedule 14.07.2010    source источник
comment
мой тип данных varchar, что я делаю сейчас...   -  person Bharanikumar    schedule 18.10.2010


Ответы (4)


Если ваше поле date_created относится к типу поля datetime или timestamp, вы можете использовать DATE_SUB в предложении where следующим образом;


WHERE date_created > DATE_SUB(NOW(), INTERVAL 24 HOUR)

person Dave Rix    schedule 14.07.2010

Итак, во-первых, date_created должен быть определен как временная метка с default current timestamp. Если у вас также есть date_modified в таблице, тогда date_modified будет иметь on update current timestamp, и вы можете определить дату, созданную как отметку времени, и этот триггер для ее обновления.

CREATE TRIGGER likes_date_entered
BEFORE INSERT ON likes
FOR EACH ROW SET NEW.date_created = NOW()

Теперь, когда у нас есть метка времени, вы можете легко применить некоторые функции даты mysql к столбцу.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Я оставлю то, что нужно сделать, в качестве упражнения для читателя, если только вы не скажете «пожалуйста» и не захотите, чтобы я привел точный синтаксис.

person umassthrower    schedule 14.07.2010
comment
Условия Джорджа или Хами будут работать, как только вы измените тип данных. - person umassthrower; 14.07.2010
comment
знаете, мой ответ лучше :-P Вычисление метки времени в PHP - плохая идея: даты указаны в стандартном времени ISO - например, 2010-07-14T00:35:31-04:00. Приходите прямо из справочника по PHP: date(c); - person umassthrower; 04.07.2011

Вы должны использовать функции даты/времени вместо LIKE.

WHERE date_created >= (NOW() - INTERVAL 24 HOUR)
person George Marian    schedule 14.07.2010
comment
@haim evgi Да, я заметил эту ошибку после того, как отправил ответ. :) - person George Marian; 14.07.2010
comment
хороший ответ, но есть одна проблема: мы должны обрабатывать время в php, а не в mysql - person Narcis Radu; 14.07.2010
comment
@narcisradu С чего бы это? - person George Marian; 14.07.2010
comment
@George Marian 1. если сервер sql и php находятся на двух разных машинах, данные времени уже не точны 2. Если сервер базы данных находится в еще одном часовом поясе, все начинает рассинхронизироваться - person Narcis Radu; 14.07.2010
comment
@narcisradu Конечно, но это ситуативно. Вы можете синхронизировать время на своих серверах с точностью до нескольких секунд. Если эти несколько секунд имеют значение, вы справляетесь с этим; возможно, как вы предложили. То же самое для пункта 2, который довольно нетипичен. - person George Marian; 14.07.2010
comment
это должен быть ИНТЕРВАЛ 24 ЧАСА, а не 24 ЧАСА - person rjha94; 15.03.2012

person    schedule
comment
@Dave Rix Добро пожаловать в stackoverflow. :) - person George Marian; 14.07.2010
comment
Вы также можете использовать арифметические операторы, такие как NOW() - INTERVAL 24 HOUR - person Aley; 20.04.2016