Порядок по количеству просмотров за последний час [MySQL] - PullRequest
3 голосов
/ 12 марта 2012

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

rank = (0.3 * viewsInCurrentHour) * (0.7 * viewsInPreviousHour)

Я хочу предпочтительно в одном запросе. Возможно ли это, или мне нужно сделать 2 запроса (один за текущий час и один за последний час, а затем просто объединить их)?

Вот DESCRIBE таблицы accesslog:

+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| aid       | int(11)          | NO   | PRI | NULL    | auto_increment |
| sid       | varchar(128)     | NO   |     |         |                |
| title     | varchar(255)     | YES  |     | NULL    |                |
| path      | varchar(255)     | YES  |     | NULL    |                |
| url       | text             | YES  |     | NULL    |                |
| hostname  | varchar(128)     | YES  |     | NULL    |                |
| uid       | int(10) unsigned | YES  | MUL | 0       |                |
| timer     | int(10) unsigned | NO   |     | 0       |                |
| timestamp | int(10) unsigned | NO   | MUL | 0       |                |
+-----------+------------------+------+-----+---------+----------------+

1 Ответ

2 голосов
/ 12 марта 2012
select
    url,
    sum(timestamp between subdate(now(), interval 2 hour) and subdate(now(), interval 1 hour)) * .3 +
    sum(timestamp between subdate(now(), interval 1 hour) and now()) * .7 as rank
from whatever_your_table_name_is_which_you_have_kept_secret
where timestamp > subdate(now(), interval 2 hour)
group by url
order by rank desc;

sum(condition) работает, потому что в mysql trye равно 1, а false равно 0, поэтому суммирование условия такое же, как и то, что некоторые нубы пишут как sum(case when condition then 1 else 0 end)

Редактировать:

Обратите внимание на добавление where timestamp > subdate(now(), interval 2 hour) для повышения производительности, поскольку только эти записи вносят вклад в результат.

...