parserALT
Страницы форума: ← Назад | 1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 600 | Дальше →

Как сделать без .menu ради уменьшения количества SQL запросов?

#1Larrikin
13.03.11 22:04
www.parser.ru → | ответить → | в избранное →

Как сделать без .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]
	}

#2Eugene Spearance
→ Larrikin [#1] | 14.03.11 05:20
www.parser.ru → | ответить → | в избранное →

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]
	}


Про первое меню ничего не могу сказать, надо знать другие вводные.
#3Larrikin
→ Eugene Spearance [#2] | 14.03.11 07:17
www.parser.ru → | ответить → | в избранное →

какие вводные? структуру базы?

вот так чуть ранее получается таблица недель
@getWeekTable[][tDays,week,day,from,to,n]
	$result[^table::create{n	from	to}]
	$tDays[^oSql.table{
#mysql specific request?
		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 ;
#4Eugene Spearance
→ Larrikin [#3] | 14.03.11 08:05 / 08:06
www.parser.ru → | ответить → | в избранное →

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 уже не нужно
#5Larrikin
→ Eugene Spearance [#4] | 14.03.11 11:45
www.parser.ru → | ответить → | в избранное →

Номеров недель всего 54.

Как же работать с прошлогодними записями? И с будущими, если проект доживёт до годовщины :)
#6Larrikin
→ Eugene Spearance [#4] | 14.03.11 12:08
www.parser.ru → | ответить → | в избранное →

собственно, если нужен образец самих данных, то вот они http://m9a.nafronte.ru/week.html

#7Eugene Spearance
→ Larrikin [#5] | 14.03.11 13:59
www.parser.ru → | ответить → | в избранное →
год привязать не сложно, мне идеологически непонятно зачем брать точное совпадение даты из базы и расширять его до недельных отрезков? Опишите задачу словами, возможно так будет проще.
Например: получить все записи из таблицы дата которых совпадает с диапазонами дат другой таблицы...
#8Larrikin
→ Eugene Spearance [#7] | 14.03.11 14:18
www.parser.ru → | ответить → | в избранное →

словами

существует под сотню разных событий
события регистрируются в логе
нужно вывести понедельную статистику сколько раз происходило событие
Страницы форума: ← Назад | 1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 600 | Дальше →