Помогите сформулировать запрос

elven

Новичок
Помогите сформулировать запрос

У меня есть таблица
PHP:
CREATE TABLE `stat` (
  `id` int(11) NOT NULL auto_increment,
  `t_id` int(11) NOT NULL default '0',
  `edate` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `t_id` (`t_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
в ней при просмотре новости записывается время и номер новости.

Делаю систему статистки. Сделал несколкьо ваариантов выборок топ по просмотам (общий, за день, за неделю и т.д.)
Но вот задумал сделать следующую выборку:
(количество просмотров / количество дней записи) в порядке убывания
как реализовать?

1) можно ли это сделать только пользуясь этой таблицей (stat)?
- выяснить дату первой записи t_id,
- найти разницу с текущим днем
- количество записей где t_id/разницу в днях
- отсортировать в порядке убывания

2) Или же мне придется обязатеьно объединять с другой таблицей (topic) (где хранятся записи новостей)?
при этом stat.t_id = topic.id
edate=дата внесения записи
 

hermit_refined

Отшельник
1) - можно. но результат в общем случае будет отличен от 2).
+ нужно понимать, что подобные запросы вызовут сканирование всей таблицы, etc.
 

elven

Новичок
Вроде бы сам сделал, но по второму варианту, по первому варианту, запрос оказался слишком сложным, со встроенным подзапросом:

PHP:
SELECT (count( s.t_id ) / DATEDIFF(CURDATE( ) , t.edate)) AS ind, s.t_id, t.header
FROM stat AS s
LEFT JOIN topics AS t ON ( s.t_id = t.id ) 
GROUP BY s.t_id
ORDER BY ind DESC 
LIMIT 0 , 20
можно ли его оптимизировать? или улучшить запрос?

P.S. Спасибо rotoZOOM, без ссылки на мануал по Date and Time Functions (в другом моем вопросе) я бы не смог сделать данный запрос.
 

chira

Новичок
elven
ты думаешь, что t.edate будет содержать именно ту дату которую ты ожидаешь?
при варианте, что статью просмотрят более 1 раза, т.е. будет несколько строк с одинаковым s.t_id, значение t.edate будет не предсказуемо ...

-~{}~ 02.02.07 13:22:

если "количество дней записи" можно назвать "количество дней с начала просмотра статьи", то нужно немного изменить запрос:
SELECT (count( s.t_id ) / DATEDIFF(CURDATE( ) , MIN(t.edate))) AS ind
 

elven

Новичок
спасибо, попробую поправить

Это же способ по первому варианту? спасибо, за пример. а я пытлся сперва вместо min(s.edate) ставить подзапроз (select m.edate from stat as m where m.t_id = t.t_id order by m.edate desc limit 0,1). Но потом запутсался и решил сделать по второму варианту.


только там надо вместо t.edate ставить s.edate, у меня в t.edate записано число внесения записи.

SELECT (count( s.t_id ) / DATEDIFF(CURDATE( ) , MIN(s.edate))) AS ind
 
Сверху