Hallo SelfForum,
ich möchte bei einer Gewinnspiel-Datenbank auswerten, in welchem Monat wieviele Besucher bei dem Gewinnspiel mitgemacht haben.
Die Tabelle umfasst über 600.000 Einträge und ist wie folgt aufgebaut:CREATE TABLE participant (
answer varchar(255) NOT NULL default '',
surname varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
email varchar(255) NOT NULL default '',
address varchar(255) NOT NULL default '',
code varchar(255) NOT NULL default '',
city varchar(255) NOT NULL default '',
age int(2) NOT NULL default '0',
part_id int(11) NOT NULL auto_increment,
entry timestamp(14) NOT NULL,
PRIMARY KEY (part_id)
) TYPE=MyISAM COMMENT='Teilnehmer Gewinnspiel';In Perl werte ich jetzt die Teilnehmer für dieses Jahr wie folgt aus:
my $year = '2003';
my $entrys_year = $Config::DBH->selectrow_array( "SELECT COUNT(part_id) FROM participant WHERE year(entry) = $year" );
my $entrys_januar = $Config::DBH->selectrow_array( "SELECT COUNT(part_id) FROM participant WHERE YEAR(entry) = $year AND MONTH(entry) = 1" );
my $entrys_februar = $Config::DBH->selectrow_array( "SELECT COUNT(part_id) FROM participant WHERE YEAR(entry) = $year AND MONTH(entry) = 2" );
.
.
.... bis "12"Es Dauert verdammt lange, bis sich die Ergebnisse zu sehen bekomme (Wenn mir sogar ein Server-Timeout nicht dazwischen kommt).
Ich habe auch schon mal die Variante ausprobiert, zuerst alle Zeilen einzulesen, und dann in Perl in die verschiedenen Monate auszuwerten, jedoch ohne nennenswerten Geschwindigkeits-Erfolg.
my $sth = $Config::DBH->prepare( "SELECT date_format(entry, '%m') FROM participant WHERE YEAR(entry) = $year" );
$sth->execute();
my $eintraege = $sth->fetchall_arrayref();
foreach my $item (@$eintraege ) {
my ( $month ) = @$item;
if ( $month eq "01" ) { $entrys_januar++ }
elsif ( $month eq "02" ) { $entrys_februar++ }
elsif ( $month eq "03" ) { $entrys_maerz++ }
elsif ( $month eq "04" ) { $entrys_april++ }
elsif ( $month eq "05" ) { $entrys_mai++ }
elsif ( $month eq "06" ) { $entrys_juni++ }
elsif ( $month eq "07" ) { $entrys_juli++ }
elsif ( $month eq "08" ) { $entrys_august++ }
elsif ( $month eq "09" ) { $entrys_september++ }
elsif ( $month eq "10" ) { $entrys_september++ }
elsif ( $month eq "11" ) { $entrys_november++ }
elsif ( $month eq "12" ) { $entrys_dezember++ }
$entrys_year++;
}
warum machst Du das so?
Ich würde das in EINER Abfrage machen, d.h. mittels group by month.
Schleifen sollte man generell minimieren.
Gruß
Reiner