Как сделать без .menu ради уменьшения количества SQL запросов? |
@getStatHash[week][w]
^if($week){
$result[^hash::create[]]
^week.menu{
$w($week.n)
$result.$w[^oSql.hash{
SELECT
app_id
,COUNT(*) AS cnt
FROM
weekly
WHERE
dt > '$week.from'
AND
dt < '$week.to'
GROUP BY
app_id
}]
$result.$w.total(^oSql.int{
SELECT
COUNT(*)
FROM
weekly
WHERE
dt > '$week.from'
AND
dt < '$week.to'
})
$result.total($result.total+$result.$w.total)
}
}{
^throw[bad.param;getStatHash;Wrong param]
}
|
Re: как минимум от второго запроса можно точно избавиться |
@getStatHash[week][w]
^if($week){
$result[^hash::create[]]
^week.menu{
$w($week.n)
$result.$w[^oSql.hash{
SELECT
app_id
,COUNT(*) AS cnt
FROM
weekly
WHERE
dt > '$week.from'
AND
dt < '$week.to'
GROUP BY
app_id
}]
$result.$w.total(0)
^result.$w.foreach[k;v]{^result.$w.total.inc($v.cnt)}
^result.total.inc($result.$w.total)
}
}{
^throw[bad.param;getStatHash;Wrong param]
}
Про первое меню ничего не могу сказать, надо знать другие вводные. |
какие вводные? структуру базы? |
вот так чуть ранее получается таблица недель
@getWeekTable[]
$result[^table::create{n from to}]
$tDays[^oSql.table{
SELECT
DATE_FORMAT(dt,'%Y-%m-%d') as date
FROM
weekly
GROUP BY
date
ORDER BY
date
}]
^if($tDays){
^tDays.menu{
$day[^date::create[$tDays.date]]
$week[^date:calendar[rus]($day.year;$day.month;$day.day)]
$to[${week.year}-${week.month}-${week.day}]
^if(!^from.length[]){ $from[$to] }
^if($to gt $from){
$n($n+1)
^result.append[$n $from $to]
$from[$to]
}
}
^week.offset(-1)
^result.append[^eval($n+1) $from ${week.year}-${week.month}-${week.day} 23:59:59]
^result.sort($result.n)[desc]
}
в такой таблице лежат данные
-- phpMyAdmin SQL Dump
-- version 2.11.11.3
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Мар 14 2011 г., 07:15
-- Версия сервера: 4.1.25
-- Версия PHP: 4.4.9
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- База данных: `m9a`
--
-- --------------------------------------------------------
--
-- Структура таблицы `weekly`
--
CREATE TABLE IF NOT EXISTS `weekly` (
`id` int(8) NOT NULL auto_increment,
`dt` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'when launch detected',
`computer` varchar(127) NOT NULL default '' COMMENT 'where launched',
`app_id` int(4) NOT NULL default '0' COMMENT 'application id from app table',
PRIMARY KEY (`id`),
KEY `idx2` (`app_id`,`dt`),
KEY `dt` (`dt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='data for weekly report' AUTO_INCREMENT=38308 ;
|
Re: уже лучше |
не очень понятно зачем такая сложная таблица недель? что если в табличку записать скажем номера недель?
тогда запрос станет:
$result.$w[^oSql.hash{
SELECT
app_id
,COUNT(*) AS cnt
FROM
weekly
WHERE
WEEK(dt) IN (^week.menu{$week.number}[,])
GROUP BY
app_id
}]
и тогда .menu уже не нужно |
Номеров недель всего 54. |
| Как же работать с прошлогодними записями? И с будущими, если проект доживёт до годовщины :) |
|
год привязать не сложно, мне идеологически непонятно зачем брать точное совпадение даты из базы и расширять его до недельных отрезков? Опишите задачу словами, возможно так будет проще. Например: получить все записи из таблицы дата которых совпадает с диапазонами дат другой таблицы... |
словами |
существует под сотню разных событий события регистрируются в логе нужно вывести понедельную статистику сколько раз происходило событие |