codice:
CREATE TABLE `presenze` (
`prog` int(11) NOT NULL auto_increment,
`id` int(11) default NULL,
`data` datetime default NULL,
`stato` int(11) default NULL,
PRIMARY KEY (`prog`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
/*Data for the table `presenze` */
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (1,1,'2010-01-01 10:00:00',0);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (2,1,'2010-01-01 10:20:00',3);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (3,1,'2010-01-01 10:30:00',5);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (4,1,'2010-01-01 14:00:00',2);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (5,1,'2010-01-01 14:40:00',5);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (6,1,'2010-01-01 15:00:00',4);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (7,1,'2010-01-01 16:00:00',1);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (8,2,'2010-01-01 09:00:00',0);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (9,2,'2010-01-01 10:00:00',5);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (10,2,'2010-01-01 10:30:00',0);
insert into `presenze` (`prog`,`id`,`data`,`stato`) values (11,2,'2010-01-01 11:00:00',1);
select tab.id2 as id,sec_to_time(sum(time_to_sec(diff))) as totale from (
select p1.*, p2.id as id2,p2.data as data2,p2.stato as stato2,
if(p1.stato<>5,sec_to_time(unix_timestamp(p2.data) - unix_timestamp(p1.data)),0) as diff
from presenze as p1, presenze as p2
where p1.data < p2.data and p1.id = p2.id
group by p1.prog
order by p1.prog) as tab
group by tab.id2
edit. Come tu stesso puoi vedere ho provato la query su un numero misero di record. Fai le opportune verifiche su un campione rappresentativo per accertarti che fili liscio in tutte le circostanze.