Можно ли все это одним запросом?

[/QUOTE]
нет, это вычисляется один раз, просто смотриться страшно
=)
К сожалению в
PHP:
SELECT count(a.url) as hits, count(DISTINCT(a.ip)) as hosts, count(DISTINCT(a.stat_cookies)) as visitors, DATE_FORMAT(b.datetime, '%Y-%m-%d') as bdate FROM page_stat as a, page_stat as b where (b.datetime >= '2003-01-12' AND b.datetime <= '2003-02-12') and (a.datetime >= b.datetime AND a.datetime <= '2003-02-12') group by bdate order by bdate desc

что-то не то (видимо надо мудрить в where)
 
стоп. у тебя получается полное декартовое произведение двух таблиц по 30000 записей итого получается 900 миллионов записей, естественно, что mysql не очень хочет все это проверять. лучше сделай три простых запроса.
 
Если у тебя минимальная временная единица по которой ты хочешь получить статистику - это сутки,
то нужно сделать небольшую подготовку перед объединением таблиц.

Код:
CREATE TEMPORARY TABLE page_stat_tmp ( dt datetime )
SELECT distinct
 CONCAT(date_format(datetime,'%Y-%m-%d'),' 23:59:59')
FROM page_stat
WHERE
  datetime BETWEEN date_sub('2003-02-12', interval 1 month)
       AND '2003-02-12'

//и дальше использовать эту временную таблицу
//если тебе нужен нарастающий итог ты по моему забыл одно условие a.datetime <= b.dt

SELECT count(a.url) as hits, count(DISTINCT(a.ip)) as hosts, count(DISTINCT(a.stat_cookies)) as visitors, b.dt as bdate
FROM page_stat as a, page_stat_tmp as b
where 
  a.datetime <= b.dt
  AND a.datetime >= b.dt //???????? может здесь должно быть date_sub('2003-02-12', interval 1 month)
  AND a.datetime <= '2003-02-12'
group by bdate
order by bdate desc
Запрос получается "тяжелый" (обрабатывает много записей)
Если такую выборку делать часто , то лучше подумать над другим алгоритмом.
 
Сверху