parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

накопилось...

agat 21.01.2007 10:47

Вопрос №1

Есть таблица
CREATE TABLE `site_statistics` (
  `id` int(11) NOT NULL auto_increment,
# поле содержит дату учета
  `dt_counted` date default NULL,
# номер новости - если номер = 0, то это учет посещений сайта за дату
  `article_id` int(11) unsigned default '0',
# количество прочтений новости(посещений сайта если article_id = 0)
  `read_count` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `dt_counted` (`dt_counted`,`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Таблица собирает статистику по прочитанным новостям и уникальным посещениям сайта. Прочли новость, смотрим в таблицу - если ее уже сегодня читали - инкрементим счетчик read_count, если не читали - добавляем запись. Счетчик посещений сайта работает также, но только с article_id = 0.

Далее. Нужно получить статистику в виде таблицы с полями дата_учета, кол-во_посещений, кол-во_прочитанных_новостей, кол-во_прочтений. Написал запрос
	SELECT
		T1.dt_counted,
		T1.read_count AS site,
		COUNT(T2.read_count) as article,
		SUM(T2.read_count) AS total_read
	FROM
		site_statistics AS T1
	LEFT JOIN
		site_statistics AS T2
	ON
		T1.dt_counted = T2.dt_counted
	AND
		T1.article_id = 0
	AND
		T2.article_id != 0
	GROUP BY
		T1.dt_counted
	ORDER BY
		T1.dt_counted
Запрос работает. Проверил его на эксплеин - вроде все путем.

Это все вступление. Задача вот в чем. Результат вышеописанного запроса вернет определенное количество строк - на каждую дату учета по одной. Понятно, что выводить весь список на одну страницу нельзя. Прикручиваю скроллер с лимитом в 30, вернее пытался прикрутить. Для работы скроллера нжно кол-во всех строк результата. И как их получить - я не нашел. Пробовал все варианты COUNT() - не пашет. Полез в доку в надежде найти намек на решение. Нашел следующее:
FOUND_ROWS()
Returns the number of rows that the last SELECT SQL_CALC_FOUND_ROWS ... command would have returned
Испробовал
SELECT
SQL_CALC_FOUND_ROWS
		T1.dt_counted,
		T1.read_count AS site,
		COUNT(T2.read_count) as article,
		SUM(T2.read_count) AS total_read
	FROM
		site_statistics AS T1
	LEFT JOIN
		site_statistics AS T2
	ON
		T1.dt_counted = T2.dt_counted
	AND
		T1.article_id = 0
	AND
		T2.article_id != 0
	GROUP BY
		T1.dt_counted
	ORDER BY
		T1.dt_counted;
SELECT FOUND_ROWS()
Работает. Но ведь это не вариант? А если до последнего запроса SELECT FOUND_ROWS() другой юзер вызовет запрос с SQL_CALC_FOUND_ROWS?

Как быть? Подскажите?

Вопрос №2
Вопрос, скорее всего, к Мише. Хотелось, чтобы он ответил.
Вопрос по поводу кеширования SQL-запросов.
Вот у меня есть динамический метод выборки данных из БД. Запрос строится в зависимости от входящих параметров, понятно, что сохранять их кеш нужно под уникальными именами. Как это обеспечить? Писать блок иф-ов на анализ входящих параметров - сакс. Придумал криптить получаемый запрос в мд5 и полученный результат давать, как название файла кеша. Как устроено у вас?

Вопрос №3
Тоже приоритетно Мише. Касается вот этого.
Как быть с именами ключей в хешах и таблицах? ИМХО вариант
$hVariable.iVariable
# или
$tVariable.sVariable
смотрится не по-парсеровски, ведь поля, к примеру, объекта класса $file пишутся как $file.text и т.д. А хочется иметь определенный стандарт. Как быть?