Incuriosito dal tuo thread ci ho smanettato un pò sopra e ho trovato questo link che proponeva una soluzione interessante per il tuo problema:
http://www.artfulsoftware.com/queries.php#16
Ti posto anche il dump che ho utilizzato io per le mie prove. Non devi fare altro che incollarlo.
Della tabella affitto devi solo crearti la struttura, i dati verranno inseriti dinamicamente.
L'unica modifica che devi fare nello script è quella di mettere al posto di tabella_appoggio una tua tabella qualsiasi che contenga un numero abbastanza alto di record da coprire la massima differenza di date della tua tabella.
(Nel senso che sei ha un record con data_inizio affitto 2004-01-01 e data fine 2006-01-01, la tua tabella d'appoggio deve avere almeno 730 record (ho fatto un calcolo approssimativo.
codice:
CREATE TABLE `affitti` (
`id` int(11) NOT NULL auto_increment,
`data_dal` date default NULL,
`data_al` date default NULL,
`prezzo` int(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (1,'2006-10-28','2006-11-10',20);
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (2,'2006-10-10','2006-10-15',15);
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (3,'2006-04-03','2006-04-28',10);
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (4,'2004-02-27','2004-03-09',5);
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (5,'2006-11-11','2006-11-19',30);
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (6,'2005-12-20','2006-01-15',4);
insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (7,'2006-01-01','2006-01-10',8);
CREATE TABLE `affitto` (
`id` int(11) NOT NULL auto_increment,
`datas` date default NULL,
`prezzo` int(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Codice PHP:
<?php
// connessione e selezione db
// Ogni volta elimino tutto il contenuto della tabella affitto,
// quella che contiene il range di tutte le date coi rispettivi prezzi
$elimina = mysql_query("truncate affitto") or die(mysql_error() );
// Dalla tabella affitti recupero tutto il contenuto più la differenza di giorni tra i due estremi
// dell'intervallo
$query = mysql_query("select *,datediff(data_al,data_dal) as giorni from affitti") or die(mysql_error() );
while ($row = mysql_fetch_assoc($query) ) {
// incremento il numero di giorni di un'unità.
//Per datediff (2006-01-02) - (2006-01-01) sarebbe pari a 1 ma ovviamente son due giorni di affitto.
$giorni = $row['giorni'] + 1;
$dal = $row['data_dal']; // recupero data di partenza del periodo di affitto
$prezzo = $row['prezzo']; // ... e il rispettivo prezzo
// Soluzione suggerita in questo link: [url]http://www.artfulsoftware.com/queries.php#16[/url]
// utilizzare una tabella di appoggio che contenga un numero di record almeno pari
// alla differenza massima tra le due date della mia tabella
$query2 = mysql_query("INSERT INTO affitto (id)
SELECT NULL FROM tabella_appoggio LIMIT $giorni;") or die(mysql_error() );
$ultimo = mysql_insert_id(); // ricavo l'id dell'ultimo record inserito. Mi servirà nel where successivo
// Mi creo un record per ogni giorno compreso nell'intervallo tra le due date e a ciascun
// record assegno il prezzo corrispondente
$query3 = mysql_query("UPDATE affitti,affitto
SET affitto.datas = '$dal' + interval (affitto.id - $ultimo) day,
affitto.prezzo = $prezzo
where affitto.id >= $ultimo") or die(mysql_error() );
}
// A questo punto che ho un record per ogni giorno posso usare le funzioni di raggruppamento
// e calcolare il totale per ogni mese/anno
$query_affitti = mysql_query("select sum(prezzo) as totale, extract(YEAR_MONTH from datas) as periodo
from affitto group by extract(YEAR_MONTH from datas) order by periodo asc")
or die(mysql_error() );
// Li stampo a video
echo '<table>';
echo '<thead>';
echo '<tr>';
echo '<td>Totale</td>';
echo '<td>Periodo</td>';
echo '</tr>';
echo '</thead>';
while ($row2 = mysql_fetch_assoc($query_affitti) ){
echo '<tr>';
echo "<td>$row2[totale]</td>";
echo "<td>$row2[periodo]</td>";
echo '</tr>';
}
echo '<table>';
?>
Ovviamente se qualcuno conosce una soluzione più efficiente si faccia avanti.