[MySQL] 91. Select Anfrage dauert länger

C22

Mitglied
Hallo Forum,

folgendes Phänomen, in einem Zeiterfassungssystem habe ich für eine Auswertungsseite ca. 350 SELECT Anfragen. Es ist eine Monatsübersicht und es gibt 11 Stati, daraus resultieren diese 350 Aufrufe in der Art:

Code:
SELECT SUM(unix_timestamp(endzeit) - unix_timestamp(startzeit)) from zeiten WHERE uid = '$uid' AND startzeit LIKE '$heute%' AND status = 1

Die Ergebisse werden in eine Tabelle geschrieben, das komische ist, die 91. Select Anfrage dauert ca. 2 Sekunden, die ersten 90 werden recht schnell rausgeschrieben und er Rest dann auch.
Gibt es dafür eine globale Einstellung o.ä. oder was könnte der Grund dafür sein? [MySQL 4.0.24]

mfg
 
350 Abfragen erscheinen mir etwas viel. Vielleicht kann man ja einige davon einsparen bzw. zusammenfassen. Wie sieht denn die Datenbankstruktur aus und welche Daten sollen abgefragt werden?
 
Hallo,
es gibt eine Tabelle 'zeiten' mit den Spalten Id, UserId(int), Status(int), startzeit(datetime) und endzeit(datetime).
Bei jeder Stempelung wird ein Datensatz hinzugefügt. Es gibt 11 verschiedene Stati.
Ich möchte mir jetzt monatsweise Statistiken ansehen, d.h. für jeden einzelnen Tag die Gesamtzeit jedes Status über obige Abrage.
Ich iteriere über eine for Schleife durch den Monat
PHP:
if(isset($_POST['month'])){
$month = $_POST['month'];
}else{
$month = date("m");
}

if(isset($_POST['year'])){
$year = $_POST['year'];
}else{
$year = date("Y");
}

$firstdate = mktime(0, 0, 0, $month, 1, $year);

for($i = 1; $i <= date('t', $firstdate); $i++){
// führende Null anlegen wenn nötig
	if($i < 10){
		$j = "0".$i;
		}else{
		$j = $i;}

	$heute = $year."-".$month."-".$j;

/* sql-Abfragen und Ausgabe... */

max. 31 Tage * 11 Stati = 341 Abfragen + Gesamtzeiten des ganzen Monats macht ca 350.

mfg
 
Hallo,

den Großteil davon könnte man meiner Meinung nach in eine Abfrage packen:

Code:
SELECT
	`userid`,
	`status`,
	DAYOFMONTH(`startzeit`) AS `tag`,
	SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(`endzeit`, `startzeit`)))) AS `gesamtzeit`
FROM
	`zeiten`
WHERE
	EXTRACT(YEAR_MONTH FROM `startzeit`) = $year$month
GROUP BY
	`userid`,
	`tag`,
	`status`

Grüße Matthias
 
Hallo Matthias,
danke für die Antwort, das muss ich mir mal näher ansehen. Ich weiß nur dass z.B. timediff aufgrund meiner Mysql Version (4.0.24) nicht funktioniert.

mfg
 
Dafür könnte man folgenden Workaround verwenden:
Code:
SEC_TO_TIME(SUM(UNIX_TIMESTAMP(`endzeit`) - UNIX_TIMESTAMP(`startzeit`))) AS `gesamtzeit`
 
Zurück