letzten Eintrag eines jeden tages ausgeben

quidnovi

Erfahrenes Mitglied
Hi folks,

hab' mir schon die Augen wund gesucht, aber keine Lösung gefunden (vielleicht auch müde in Anbetracht der Stunde).

Habe in meiner Db pro Tag mehrere Einträge. Jetzt möchte ich den letzten eines jeden Tages ausgeben.

So geht's leider nicht:
Code:
$sql = "SELECT * FROM ".$abrechnung." ".
	"WHERE persnr ='".$_SESSION['user_persnr']."' ".
	"ORDER BY `datTag`,`ende` DESC LIMIT 1";
$erg = mysql_query($sql) or die("MySQL-Fehler ".mysql_error());

datTag = das jeweilige Datum
ende = die 2. Uhrzeit

Die Einträge sehen so aus:
1.1.2008 | 07:00 | 12:00
1.1.2008 | 12:30 | 16:30

2.1.2008 | 07:30 | 12:00
2.1.2008 | 12:30 | 17:00

3.1.2008 | 07:00 | 12:00
3.1.2008 | 12:30 | 16:30

4.1.2008 | 07:30 | 12:00
4.1.2008 | 12:30 | 17:00

Mit meiner Abfrage erhalte ich immer nur den 2. Datensatz des 1. Tages, und das gleich 4 mal.
Verständlicher Weise möchte ich aber den 2. Datensatz eines jeden Tages ausgeben.

Bitte helft mir die "ODER BY und LIMIT" Klausel richtig zu coden. Danke
 
Hi,

das kannst Du mit einer Gruppierung nach Datum und der MAX-Funktion hinbekommen:

Code:
SELECT *, MAX(uhrzeit) as letzter_eintrag FROM tabelle GROUP BY  datum

LG
 
Hallo!
Die Einträge sehen so aus:
Da hast Du schonmal das erste Problem bzw. wirst es über kurz oder lang zwangsweise bekommen.
Denn bei deiner Datenbankstruktur kommt z.b. der 17.9.2008 VOR dem 2.1.2008, weil 1 nunmal kleiner als 2 ist. ;)

Beim Spaltentyp DATE für das Datum mit Datum im englischen Format (YYYY.MM.DD) und Spaltentyp TIME für die Uhrzeit (HH:MM:SS), könnte die Abfrage so aussehen:
SQL:
"SELECT * , max(`ende`)
FROM `".$abrechnung."`
WHERE `persnr` = '".$_SESSION['user_persnr']."'
GROUP BY (`datTag`)
ORDER BY `datTag` DESC"
Gruss Dr Dau
 
Wow! Danke für Eure Antworten - um diese Zeit :)

Nun bin ich doch schon ein wenig weiter.

Habe die Abfrage nun so:
PHP:
$sql = "SELECT *,SUM(`hGesamt`) as 'summe', ".
		   "MAX(`beginn`) as lastBeginn ".
	       "MAX(`ende`) as lastEnd, ".
	       "FROM ".$abrechnung." ".
		   "WHERE `persnr` ='".$_SESSION['user_persnr']."' ".
		   "AND `status` = 1 ".
		   "GROUP BY `datTag`";
	$res = mysql_query ($sql) or die (mysql_errno() . ": Keine Verbindung zu \"".$abrechnung."\"! " . mysql_error());

	while ($row = mysql_fetch_object($res)){
		
		// Wenn die Gesamtstunden pro Tag 8,5 übersteigen
		if($row->summe > 8.5){

				// Nun 30 Minuten von der Endzeit subtrahieren
				$ergH = $row->hGesamt - 0.5;
				$uhrz = $row->lastEintrag;
				$uhr = explode(":",$uhrz);
				$zeit = mktime($uhr[0],$uhr[1]);
				$ber = ($zeit-1800);
				$neuH = strftime("%H:%M", $ber);

				echo $row->id."|".$row->datTag."|". $row->hGesamt."|".$row->wochentag."|".$row->beginn."|".$row->lastEintrag." ".$neuH."<br />";
		}
	}

und erhalte folgendes Ergebnis:
Code:
1 | 2007-12-31 | 5 | mo | 12:30 | 16:30 | 16:00
3 | 2008-01-01 | 4.5 | di | 12:30 | 17:00 | 16:30
5 | 2008-01-02 | 5 | mi | 12:30 | 16:30 | 16:00
7 | 2008-01-03 | 4.5 | do | 12:30 | 17:00 | 16:30

Hier sind leider nur das Datum und die Uhrzeit richtig.
Die id's, die Wochentage und vor allem die Gesamtstunden nimmt die Abfrage vom ersten Eintrag des betreffenden Tages.

Könnt Ihr mir bitte den Fehler aufzeigen?
 
Moin quidnovi,

das eigentlichStatement müsste in etwa so aussehen:
Code:
Select id, dattag, start, ende, Persnr from (
SELECT  dattag as dt, Max(ende)as Highend, First(Persnr) as pn   FROM  abrechnung
WHERE persnr ='1'
group by dattag
order by DatTag asc ) , abrechnung 
where dt=dattag
and pn=persnr
and ende=highend

...wobei ich statt "WHERE `persnr` ='".$_SESSION['user_persnr']."' ". oben mal "WHERE persnr='1' eingesetzt habe.
Aber ich gehe davon aus, dass Du Deine Statements ja ohnehin erstmal direkt testest.

Was Du übrigens meinst mit "die Wochentage... nimmt die Abfrage von ersten Eintrag des betreffenden Tages".... was sollte DAS für einen Unterschied machen?

Grüße
Biber
 
Zurück