drug
Новичок
как правильно и оптимлаьно построить сложный запрос?
господа, сижу уже давно. сам неосилю..
существует ряд таблиц:
CREATE TABLE `TBL_EVENT` (
`id` int(11) NOT NULL auto_increment,
`organization_id` int(11) NOT NULL default '0',
`calendar_id` int(11) NOT NULL default '0',
`dtstamp` datetime NOT NULL default '0000-00-00 00:00:00',
`summary` tinytext collate latin1_bin NOT NULL,
`description` text collate latin1_bin,
`evtype` enum('onetime','recurrent') collate latin1_bin NOT NULL default 'onetime',
PRIMARY KEY (`id`),
KEY `EVENT` (`organization_id`,`calendar_id`,`evtype`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=1 ;
CREATE TABLE `TBL_ONETIME` (
`event_id` int(11) NOT NULL default '0',
`dtstart` datetime NOT NULL default '0000-00-00 00:00:00',
`dtend` datetime NOT NULL default '0000-00-00 00:00:00',
KEY `ONETIME` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
CREATE TABLE `TBL_RRULE1` (
`event_id` int(11) NOT NULL default '0',
`duration` datetime NOT NULL default '0000-00-00 00:00:00',
`frequency` enum('daily','weekly','monthly','yearly') collate latin1_bin default 'daily',
`until` datetime NOT NULL default '0000-00-00 00:00:00',
`count` int(11) default '1',
`interval` int(11) default '1',
KEY `RRULE1` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
CREATE TABLE `TBL_RRULE2` (
`event_id` int(11) NOT NULL default '0',
`rule` enum('byminute','byhour','byday','bymonthday','byyearday','byweekno','bymonth') collate latin1_bin NOT NULL default 'byminute',
`value` int(11) NOT NULL default '0',
KEY `RRULE2` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
Это календарь событий.
Необходимо вывести ТБЛ1 если:
1. TBL_EVENT.evtype == 'onetime', то СМ. пункт 2., TBL_EVENT.evtype == 'recurrent', то СМ. пункт 3.
2. NOW(текущая дата_время) находится в интервале TBL_ONETIME.dtstart .... TBL_ONETIME.dtend
я это реализовал так:
SELECT * FROM TBL_ONETIME WHERE (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(dtstart)) <= (UNIX_TIMESTAMP(dtend)-UNIX_TIMESTAMP(dtstart)))
уверен, что можно и оптимальнее, подскажите как
3. событие с продолжительностью 'duration', частотой 'frequency', до даты_времени 'until', c числом повторов 'count' и иентервалом 'interval', проходящее по 'rule' со значением 'value' охватывало NOW.
"проходящее по 'rule' со значением 'value' охватывало NOW" сделал так:
....WHERE rule = 'byminute' AND UNIX_TIMESTAMP($now) BETWEEN UNIX_TIMESTAMP($year.$month.$day.$hour.value) AND (UNIX_TIMESTAMP($now)+TIME_TO_SEC($duration))
как бы получше?
вот такой вот непростой запросик! =)
phpclub - последняя надежда..
господа, сижу уже давно. сам неосилю..
существует ряд таблиц:
CREATE TABLE `TBL_EVENT` (
`id` int(11) NOT NULL auto_increment,
`organization_id` int(11) NOT NULL default '0',
`calendar_id` int(11) NOT NULL default '0',
`dtstamp` datetime NOT NULL default '0000-00-00 00:00:00',
`summary` tinytext collate latin1_bin NOT NULL,
`description` text collate latin1_bin,
`evtype` enum('onetime','recurrent') collate latin1_bin NOT NULL default 'onetime',
PRIMARY KEY (`id`),
KEY `EVENT` (`organization_id`,`calendar_id`,`evtype`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=1 ;
CREATE TABLE `TBL_ONETIME` (
`event_id` int(11) NOT NULL default '0',
`dtstart` datetime NOT NULL default '0000-00-00 00:00:00',
`dtend` datetime NOT NULL default '0000-00-00 00:00:00',
KEY `ONETIME` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
CREATE TABLE `TBL_RRULE1` (
`event_id` int(11) NOT NULL default '0',
`duration` datetime NOT NULL default '0000-00-00 00:00:00',
`frequency` enum('daily','weekly','monthly','yearly') collate latin1_bin default 'daily',
`until` datetime NOT NULL default '0000-00-00 00:00:00',
`count` int(11) default '1',
`interval` int(11) default '1',
KEY `RRULE1` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
CREATE TABLE `TBL_RRULE2` (
`event_id` int(11) NOT NULL default '0',
`rule` enum('byminute','byhour','byday','bymonthday','byyearday','byweekno','bymonth') collate latin1_bin NOT NULL default 'byminute',
`value` int(11) NOT NULL default '0',
KEY `RRULE2` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
Это календарь событий.
Необходимо вывести ТБЛ1 если:
1. TBL_EVENT.evtype == 'onetime', то СМ. пункт 2., TBL_EVENT.evtype == 'recurrent', то СМ. пункт 3.
2. NOW(текущая дата_время) находится в интервале TBL_ONETIME.dtstart .... TBL_ONETIME.dtend
я это реализовал так:
SELECT * FROM TBL_ONETIME WHERE (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(dtstart)) <= (UNIX_TIMESTAMP(dtend)-UNIX_TIMESTAMP(dtstart)))
уверен, что можно и оптимальнее, подскажите как
3. событие с продолжительностью 'duration', частотой 'frequency', до даты_времени 'until', c числом повторов 'count' и иентервалом 'interval', проходящее по 'rule' со значением 'value' охватывало NOW.
"проходящее по 'rule' со значением 'value' охватывало NOW" сделал так:
....WHERE rule = 'byminute' AND UNIX_TIMESTAMP($now) BETWEEN UNIX_TIMESTAMP($year.$month.$day.$hour.value) AND (UNIX_TIMESTAMP($now)+TIME_TO_SEC($duration))
как бы получше?
вот такой вот непростой запросик! =)
phpclub - последняя надежда..